我在网格视图中设置列的排序表达式。然后单击标题对列进行排序。到目前为止还不错。
但是,当我使用自动生成的选择按钮选择gridView行时:
<asp:GridView runat="server" ID="test" DataSourceID="sourceEmployees"
AutoGenerateSelectButton="true">
如果我通过单击Header对列进行排序,选择一行后,GridView仍然选择了旧行。最终选择的值将丢失。如果我选择employeeID值7,即使我按降序对列进行排序,第7行仍保持选中状态,尽管我的employeeId值7已移至不同的行。 [这里它已移至第4排,因为我有10名员工]
我还需要实现以确保无论用户对GridView进行排序的方式如何,最初选择的employeeID始终处于选中状态。
答案 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
解决了我的问题。