你可以通过在排序之前存储当前选定行(或行)的值,然后在排序后重新选择该行来解决此问题。
你需要使用CellMouseDown事件 - 必须使用此事件,因为它是在排序发生之前唯一触发的事件。类似ColumnHeaderMouseClick的替代事件都太晚了。
在CellMouseDown事件处理程序中检查行索引是否为-1,以确保已选择标题。
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1)
{
selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
}
}
我有一个类级别的字段selected
,用于存储所选列的唯一标识符。如果您没有唯一的ID,则可以添加一个用于此目的的列并将其隐藏。
然后,在 DataGridView 的 Sorted
事件处理程序中,您可以使用网格绑定源的 .Find() 方法:
void dataGridView1_Sorted(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(selected))
{
int itemFound = _bindingSource.Find("name", selected);
_bindingSource.Position = itemFound;
}
}
在调查过程中,我发现了在MSDN论坛上的这篇帖子,其中回答使用了DataBindingComplete事件--虽然我不确定为什么他们认为那是必要的,因为我的方法已经适用于我所有的测试,但你可能会发现它是一个有用的参考。