asp.net - 由于 GridView 中的旧数据而选择错误的项目

标签 asp.net visual-studio-2010 gridview data-binding multiple-users

我正在使用 C#/ASP.NET 和 SQL Server 数据库在 Visual Studio 2010 中工作。我正在尝试修复一个网站,该网站将允许经理将员工分配给各种任务。现在的问题是,如果两名经理同时工作,可能会向错误的员工分配任务。员工列表显示在 GridView 中。

出现此问题的原因似乎是其中一位用户正在 GridView 中查看旧数据。

假设第一个人加载列表,GridView 如下所示:

-员工 1

-员工 2

-员工 3

-员工 4

然后,第二个人进来并对员工 2 进行分配,这会将员工 2 从列表中删除。实际列表现在如下所示:

-员工 1

-员工 3

-员工 4

但是第一个人仍然看到这个,因为他们的页面尚未更新:

-员工 1

-员工 2

-员工 3

-员工 4

然后,第一个人尝试将员工 3 分配给任务。他们仍然看到旧的列表。当他们单击进行分配时,页面会发回服务器(显然,在 gridview 控件中选择一行是服务器端事件,因此我不确定是否有解决此问题的方法 http://forums.asp.net/t/1706468.aspx/1 )。页面重新加载并尝试执行回发事件,检查并发现控件尚未有效(因为数据绑定(bind)发生在回发事件应该被处理之后),所以我认为回发事件被延迟到数据绑定(bind)之后。 (这是页面加载上的事件顺序 http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx )一旦 gridview 被数据绑定(bind),数据就会像这样更新:

-员工 1

-员工 3

-员工 4

然后就可以处理回发事件了。回发事件包含所选控件的行索引。选择了第三行,因此回发事件从网格中获取员工 4(现在位于第三行)。然后,当我们想要员工 3 的唯一 ID 时,它会使用该信息来获取员工 4 的唯一 ID。在这种情况下,我们如何确保获得正确的员工 ID?

问题似乎是在数据绑定(bind)发生并更改网格后应用单击。我认为阻止页面进行回发是一个很好的尝试,但是 gridview 操作都是服务器端的,所以我认为我不能这样做。我不知道如何通过回发来保留绑定(bind)数据,因此每次回发时,我们都必须获取新的、可能不同的数据。 我觉得我已经经历了大部分选项,你认为我的推理有什么问题吗?或者有什么建议可以尝试新事物吗?有没有办法在页面回发之前获取员工 ID?

该页面仅适用于一名用户,只有当多个用户同时进行更改时才会出现问题。

最佳答案

您可以启用ViewState用于控件,以便在回发期间不必重新加载 GridView 数据。

相反,控件将记住回发期间首次加载的数据并继续使用该数据。

当然,这并不能解决并发问题,例如,如果有人对已删除的员工执行某些操作。在这种情况下,您必须在执行操作之前再次检查实际数据库,并在用户操作旧数据时向用户显示错误/警告。

关于asp.net - 由于 GridView 中的旧数据而选择错误的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465913/

相关文章:

c# - 通过 WebReference 或通过实例化在同一网站内使用 Web 服务之间的性能

asp.net - SQL Server 连接到另一个 SQL Server?

c# - ASP.NET MVC 5 标识中的空引用

visual-studio-2010 - 复制数据驱动测试的行为

c++ - 警告 C4127 : conditional expression is constant in cl command

c# - asp.net 列表框更新

visual-studio - 我不明白 VS 2010 中的 bulid 部署包

winforms - 当 gridview is allowedit = false 时,如何在 GridView 中启用对新插入行的编辑?

c# - 在 gridview 列中查找值

c# - ASP.NET Gridview 复选框列 - Onclick 和 jquery