2

我正在使用 C#/ASP.NET 和 SQL 服务器数据库在 Visual Studio 2010 中工作。我正在尝试修复一个允许经理分配员工执行各种任务的网站。现在的问题是,如果两个经理同时工作,可能会分配错误的员工来执行任务。员工列表以网格视图表示。

问题似乎是因为其中一位用户正在查看网格视图中的旧数据。

假设第一个人加载列表并且 GridView 看起来像这样:

-员工 1

-员工 2

-员工 3

-员工 4

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

-员工 1

-员工 3

-员工 4

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

-员工 1

-员工 2

-员工 3

-员工 4

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

-员工 1

-员工 3

-员工 4

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

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

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

4

2 回答 2

2

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

相反,控件将记住在 PostBack 期间首次加载的数据并继续使用它。

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

于 2013-05-09T16:14:07.447 回答
0

我必须自己处理数据绑定,而不是使用 ObjectDataSource 自动完成。

以前,我使用 GridView 的 DataSourceID 将其链接到数据源,该数据源将在每次页面刷新时向服务器查询数据。ObjectDataSource 导致数据自动绑定。为了获得所需的额外控制,我必须处理页面后面代码中的所有数据绑定。

我通过将 gridview 数据存储在 viewstate 中,并在每次页面刷新时从 viewstate 加载数据来做到这一点。这样我就可以控制 gridview 数据何时更新为数据库中的数据。

这两页对我的回答很有帮助:

数据绑定和回发

http://www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx

于 2013-05-10T20:11:57.887 回答