我有一个简单的,未绑定的DataGridView。在编辑任何单元格后,我希望特定列自动排序。我在dataGridView1.Sort
事件被触发时尝试调用CellEndEdit
,但是我收到 InvalidOperationException ,消息操作无效,因为它导致重新调用SetCurrentCellAddressCore函数。
知道如何让列自动排序吗?
答案 0 :(得分:4)
您无需在dataGridView1.Sort()
事件处理程序中调用CellEndEdit
,编辑单元格后将自动为您排序列。您只需指定要排序的列和顺序(升序或降序)以排序一次,例如在表单构造函数中:
//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);
}
答案 1 :(得分:1)
On Load Event put:
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);
}
答案 2 :(得分: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
}
答案 3 :(得分:-1)
告诉您的绑定源对您排序并指定要排序的列。例如:
this.table1BindingSource.Sort = "person";