2

我有一个简单的、未绑定的 DataGridView。我希望在编辑任何单元格后对特定列进行自动排序。我尝试在触发事件dataGridView1.Sort时调用CellEndEdit,但我收到InvalidOperationException消息Operation is not valid 因为它导致对 SetCurrentCellAddressCore 函数的可重入调用。

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

4

4 回答 4

5

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

//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);
    }
于 2013-07-16T06:35:24.407 回答
1

加载事件放置:

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);
}
于 2015-06-14T17:13:59.380 回答
0

这是我在单元格结束编辑后对网格进行排序的解决方案,并避免“操作无效,因为它导致对 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
}
于 2018-10-01T13:22:18.703 回答
-1

告诉您的绑定源进行排序并指定您希望排序的列。例子:

this.table1BindingSource.Sort = "person";
于 2013-07-15T22:17:19.927 回答