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

时间:2013-07-15 21:39:45

标签: c# .net winforms

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

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

4 个答案:

答案 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";