Asp.Net GridView EditIndex竞争条件?

时间:2010-10-12 03:31:17

标签: asp.net gridview

这是一个假设性的问题,它让我离开了花园小径...说我有一个我想编辑的网格视图...给定一个绑定数据的方法..

private void BindGridFirst() {
        var data = new List<string>() {
            "A","B","C","D","E","F"
        };
        gridView.DataSource = data;
        gridView.DataBind();
    }

现在假设我正在查看此页面,另一位用户已经出现并对基础数据进行了一些更改,现在我点击编辑按钮编辑 D ..

编辑方法很简单:

protected void RowEdit(object sender, GridViewEditEventArgs e) {
        gridView.EditIndex = e.NewEditIndex;
        BindGridSecond();
    }

编辑:我不得不指出,这种方法几乎用于所有在线示例,包括来自Microsoft的示例。

这个BindGridSecond()方法如下所示:

private void BindGridSecond() {
        var data = new List<string>() {
            "A", "AA", "B","C","D","E","F"
        };
        gridView.DataSource = data;
        gridView.DataBind();
    }

它完全相同,但现在数据已更改。 UI更新后,用户现在处于针对行 C 的编辑模式。

不是用户期望或想要的。如何处理这种情况以避免这样的问题?

2 个答案:

答案 0 :(得分:1)

就个人而言,我在GridView上使用DataKeyNames属性和SelectedDataKey,这样我就可以轻松获取用户想要的行的主键,而不是依赖于网格的索引。

通过使用主键,您在添加到集合中的新项目没有任何问题,例如在您的示例中。此外,使用主键可以更轻松地处理网格上的分页,因为您不必考虑页码和索引。

答案 1 :(得分:0)

Imho有两种选择:

例如,您可以在会话中缓存要绑定到网格的数据。因此,您可以在调用BindGridSecond-Method之前检查更改,并在用户浏览页面时进行任何更改时提醒用户。

在选项2中,您将再次缓存您在BindGridFirst-Method中绑定的数据,并仅使用此数据进行下一个PostBack操作。因此,您不必担心浏览网格时可能发生的更改。