编辑单元格后自动对DataGridView进行排序

本文关键字:DataGridView 排序 单元格 编辑 | 更新日期: 2023-09-27 18:22:31

我有一个简单的、未绑定的DataGridView。在编辑任何单元格后,我希望特定列自动排序。当CellEndEdit事件被激发时,我试图调用dataGridView1.Sort,但我得到了一个InvalidOperationException,消息为操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用

知道我如何使列自动排序吗?

编辑单元格后自动对DataGridView进行排序

您不必在CellEndEdit事件处理程序中调用dataGridView1.Sort(),编辑单元格后,列将自动为您排序。您只需要指定要排序的列以及排序一次的顺序(升序或降序),例如在表单构造函数中:

//This will sort ascendingly the first column
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);

然后,每次用户编辑完第一列中的单元格时,该列都会自动排序。

更新

如果DataGridView不是数据绑定的,我尝试将上面的代码行放在CellEndEdit事件处理程序中,它运行正常。我不确定为什么它不适用于您?

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if(e.ColumnIndex == 0)//Just care the first column
            dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
    }

加载事件放入:

dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);

对于UPDATE,您需要使用以下两个事件:

private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{    
      dataGridView1.EndEdit();
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if(e.ColumnIndex == 0)//Just care the first column
        dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
}

以下是我在单元格结束编辑后对网格进行排序的解决方案,并避免出现"操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用"异常。

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if(e.ColumnIndex == 0)//Just care the first column
    this.BeginInvoke(new MethodInvoker(DoSortGrid));
}
private void DoSortGrid(){        
    dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
    dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView.CurrentRow.Index;//Keep the current row in view for large list
}

告诉绑定源进行排序并指定要排序的列。示例:

this.table1BindingSource.Sort = "person";