.net - 在 WinForm 应用程序中对 DataGridView 进行排序时选定的行

标签 .net winforms datagridview c#-4.0

在 WinForm 应用程序(C# 4.0)中,我有一个绑定(bind)到 SortableBindingList 的 DataGridView。因此,可以通过单击标题列对其进行排序 - 到目前为止一切都很好;-)

问题是,所选行似乎是由行号“记住”的。发生的情况如下:

A*  <- "Selected"
B
C

现在按降序排序,C 在顶部并被选中。我希望仍然选择 A:

C*  <- "Selected"
B
A   <- "Want have"

选择多行时也会发生同样的情况。有解决方法吗?

最佳答案

您可以通过在排序之前存储当前所选行(或多行)的值,然后在排序后重新选择该行来解决此问题。

您需要使用 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 事件处理程序中,您可以使用网格绑定(bind)源的 .Find() 方法:

void dataGridView1_Sorted(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(selected))
    {
        int itemFound = _bindingSource.Find("name", selected);
        _bindingSource.Position = itemFound;
    }
}

在调查此问题时,我发现了以下内容 post在 MSDN 论坛上,答案使用了 DataBindingComplete 事件 - 我不是 100% 为什么他们认为这是必要的,因为我的方法适用于我的所有测试,但您可能会发现它是一个有用的引用。

关于.net - 在 WinForm 应用程序中对 DataGridView 进行排序时选定的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4819573/

相关文章:

c# - Entity Framework 两个查询结果相同,但一个更快

c# - 如何在 C# 中比较 DateTime?

c# - 在异步操作运行时继续工作流程

c# - DefaultView.RowFilter 不适用于日期

c# - 为什么默认情况下只有文字字符串保存在实习生池中?

C# 用户控件

c# - ComboBox:向项目添加文本和值(无绑定(bind)源)

c# - 用线程 c# 填充 datagridview

c# Datagridview (Winform) 基于相邻单元格值的单元格着色

c# - 如何通过复选框启用和禁用 DataGridView 中的特定行?