DataTable的新添加列未显示在DataGridView中的正确索引处

时间:2018-04-19 13:09:09

标签: c# .net winforms datagridview datatable

我有一个DataTable设置为DataGridView的DataSource。我在一个特定的索引处向DataTable添加一个列,如此;

DataSource.Columns.Add(columnName).SetOrdinal(index);

然而,UI显示添加到最后的新列(即一直到右侧)。当断点进入并仔细观察时,我可以看到我的DataTable和DataGridView项都将新列索引在正确的位置。这对我来说没有意义,因为DataGridView就是我在UI中看到的。

我已尝试同时执行以下操作来刷新DataSource,但正如我所说,调试时我可以看到DataGridView在正确的索引处有新列。它只是没有显示AT这个索引。

DataGrid.Refresh();
DataGrid.Update();

更新

看起来没有更新的字段是DisplayIndex。我在这里错过了一步,还是只需要在添加列时手动更新此索引?我假设DataTable DataSource也会覆盖DisplayIndex吗?

更新2

似乎hacky但这很有效。如果有更好的方法,仍然会感兴趣。

private void ensureOrdering()
    {
        foreach (DataGridViewColumn col in dgvData.Columns)
        {
            col.DisplayIndex = col.Index;
        }
    }

MCVE

在表单上有DataGridViewButton,如果您在表单的Load事件中添加一些列并将DataGridView绑定到表,那么在{{ 1}}按钮的事件插入另一列,您将看到列将显示在列列表的末尾:

Click

1 个答案:

答案 0 :(得分:0)

作为替代方案,您可以将DataSource设置为null并将其设置回数据表:

dataGridView1.DataSource = null;
dataGridView1.DataSource = dt;

注意:DataGridView收到基础ListChange的{​​{1}}事件时,它会检查更改是否是因为添加,删除或更改属性描述符,然后它调用一些有关更改数据源元数据的私有方法。如果您想阅读源代码,请启动here