Как видно из заголовка: у меня есть DataGridView с DataView в качестве источника данных.Изменение порядка столбцов с помощью перетаскивания на самом деле не работает, потому что изменения не записываются в DataView.Я попытался перехватить событие ColumnDisplayIndexChanged и напрямую изменить DataTable, но это вызывает исключение.Я не знаю, что именно вызывает исключение.Я просто знаю, что это не происходит, когда я удаляю конкретную строку.Отладчик просто ссылается на Program.cs с System.NullReferenceException.
это не работает:
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;
}));
}
}