由于GridView中的旧数据而选择了错误的项目

时间:2013-05-09 15:52:22

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

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

问题似乎发生是因为其中一个用户正在查看gridview中的旧数据。

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

-Employee 1

-Employee 2

-Employee 3

-Employee 4

然后第二个人进入并对Employee 2进行分配,从列表中删除Employee 2。实际列表现在看起来像这样:

-Employee 1

-Employee 3

-Employee 4

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

-Employee 1

-Employee 2

-Employee 3

-Employee 4

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

-Employee 1

-Employee 3

-Employee 4

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

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

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

2 个答案:

答案 0 :(得分:2)

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

相反,控件将记住PostBack期间第一个加载的数据并继续使用它。

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

答案 1 :(得分:0)

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

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

我是通过将gridview数据存储在viewstate中,并在每次刷新页面时从viewstate加载数据来实现的。通过这种方式,我可以控制何时使用数据库中的数据更新gridview数据。

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

DataBind and Postback

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