2

我为网格视图中的列设置排序表达式。然后通过单击标题对列进行排序。到此为止还好。

但是,当我使用自动生成的选择按钮选择 gridView 行时:

<asp:GridView runat="server" ID="test" DataSourceID="sourceEmployees"
 AutoGenerateSelectButton="true">

如果我通过单击标题对列进行排序,则在选择一行后,GridView 仍然选择了旧行。最初选择的值丢失。如果我选择employeeID 值7,即使我按降序对列进行排序,第7 行仍保持选中状态,尽管我的employeeId 值7 已移动到不同的行。[这里移到第 4 排,因为我共有 10 名员工]

我还需要实施什么来确保无论用户对 GridView 进行排序的方式如何,最初选择的employeeID 始终保持选中状态。

4

2 回答 2

3

您需要处理后面代码中的所有内容(在索引更改时选择/取消选择行)。这是基于您的设置的示例:

<asp:GridView DataKeyNames="EmpID"  
     SelectedRowStyle-BackColor="Yellow" ID="test" OnSelectedIndexChanged="test_SelectedIndexChanged" 
     runat="server" DataSourceID="sourceEmployees" AutoGenerateColumns="False"  
     AutoGenerateSelectButton="true" AllowSorting="true" 
     OnRowDataBound="test_RowDataBound" >

上面,我添加了两个事件处理程序,一个 forOnRowDataBound和一个 for OnSelectedIndexChanged。我还添加了DataKey以跟踪所选员工 ID。

现在,在后面的代码中,这两种方法看起来像这样:

protected void test_SelectedIndexChanged(object sender, EventArgs e)
{
    ViewState["key"]= test.SelectedDataKey.Value;//Keep track of selected employee by ID            
}

protected void test_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var row = e.Row.DataItem as DataRowView;
        if (row.Row.Field<int>("EmpID") == (ViewState["key"] != null ? (int)ViewState["key"] : -1))
        {
            test.SelectedIndex = e.Row.RowIndex;
            //Setting the selected Index is not enough, you need to programmatically
            //set the color as well. Since I used Yellow on my markup, I use the same here
            e.Row.BackColor = System.Drawing.Color.Yellow;
        }

    }
}
于 2013-08-05T16:09:47.953 回答
3

我们需要使用该GridView.EnablePersistedSelection属性。MSDN指出

如果此属性为 false 并选择了一行,则在显示新页面时会选择同一行,即使新页面中包含不同的数据也是如此。如果将此属性设置为 true,则当您显示其中包含不同数据的页面时,不会选择任何行。如果您随后返回选择了行的页面,则该行仍处于选中状态。

设置此属性以true解决我的问题。

于 2013-08-06T11:28:53.630 回答