DataGridView:对未保存在DataSource(DataView)中的列进行重新排序,几乎无法手动编辑

时间:2018-12-10 19:59:34

标签: c# winforms datagridview

正如标题所述:我有一个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;
            }));
        }
    }

0 个答案:

没有答案