DataGridView: изменение порядка столбцов, не сохраненных в DataSource (DataView), и редактирование вручную практически невозможно - PullRequest
0 голосов
/ 10 декабря 2018

Как видно из заголовка: у меня есть 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;
            }));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...