我有一个简单的、未绑定的 DataGridView。我希望在编辑任何单元格后对特定列进行自动排序。我尝试在触发事件dataGridView1.Sort
时调用CellEndEdit
,但我收到InvalidOperationException消息Operation is not valid 因为它导致对 SetCurrentCellAddressCore 函数的可重入调用。
知道如何使列自动排序吗?
您不必调用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);
}
加载事件放置:
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";