正如标题所述:我有一个DataGridView,其中有一个DataView作为数据源。通过拖放对列进行重新排序实际上不起作用,因为更改未写入到DataView中。 我试图捕获ColumnDisplayIndexChanged事件并直接修改DataTable,但这会导致异常。我不知道到底是什么引起异常。我只知道在删除特定行时不会发生这种情况。调试器仅使用System.NullReferenceException引用Program.cs。
这不起作用:
private void dgTable_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
{
if (e.Column.Index != e.Column.DisplayIndex)
{
((DataView)dgTable.DataSource).Table.Columns[e.Column.Name].SetOrdinal(e.Column.DisplayIndex);
//no exception when I delete this line
}
}
但是,这可以正常工作
private void dgTable_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
{
if (e.Column.Index != e.Column.DisplayIndex)
{
new Thread(() =>
{
Thread.Sleep(100);
dgTable.Invoke(new MethodInvoker(() =>
{
((DataView)dgTable.DataSource).Table.Columns[e.Column.Name].SetOrdinal(e.Column.DisplayIndex);
}));
}).Start();
}
}
是的,我知道,我已经有解决方案,但这是一个不好的解决方案。有人可以帮我吗?
编辑:解决方案
private void dgTable_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
{
if (e.Column.Index != e.Column.DisplayIndex)
{
dgTable.BeginInvoke(new MethodInvoker(() =>
{
dgTable.ColumnDisplayIndexChanged -= dgTable_ColumnDisplayIndexChanged;
((DataView)dgTable.DataSource).Table.Columns[e.Column.Name].SetOrdinal(e.Column.DisplayIndex);
dgTable.ColumnDisplayIndexChanged += dgTable_ColumnDisplayIndexChanged;
}));
}
}