【问题标题】:Selecting the wrong item because of old data in GridView由于 GridView 中的旧数据而选择了错误的项目
【发布时间】:2013-05-04 04:09:24
【问题描述】:

我正在使用 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.net/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?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这正是我正在寻找的解决方案;我们假设用户现在将使用单独的数据。我刚刚尝试启用 ViewState,但数据还是加载了。有没有一种好的方法可以确保它不会重新加载,除非你明确告诉它?谢谢!
    • 一开始你是如何加载数据的?确保仅在 Page.IsPostback 为 false 时调用 databind。那么应该不会重新加载数据。
    • 我将 GridView 的 DataSourceID 设置为一个 ObjectDataSource,它向服务器发送数据请求。我认为这必须自动调用 databind,因为我没有在代码中的任何地方调用 databind。
    【解决方案2】:

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

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

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

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

    DataBind and Postback

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2023-04-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多