GridView SortExpression问题

时间:2013-08-05 12:11:52

标签: asp.net gridview

我在网格视图中设置列的排序表达式。然后单击标题对列进行排序。到目前为止还不错。

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

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

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

我还需要实现以确保无论用户对GridView进行排序的方式如何,最初选择的employeeID始终处于选中状态。

2 个答案:

答案 0 :(得分: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" >

上面,我添加了两个事件处理程序,一个用于OnRowDataBound,另一个用于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;
        }

    }
}

答案 1 :(得分:3)

我们需要使用GridView.EnablePersistedSelection属性。 MSDN表示

  

如果此属性为false且选择了行,则即使新页面中包含不同的数据,也会在显示新页面时选择相同的行。如果将此属性设置为true,则当您显示其中包含不同数据的页面时,不会选择任何行。如果您然后返回到选择了行的页面,则仍然选择该行。

将此属性设置为true解决了我的问题。