我有一个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
在表单上有DataGridView
和Button
,如果您在表单的Load
事件中添加一些列并将DataGridView
绑定到表,那么在{{ 1}}按钮的事件插入另一列,您将看到列将显示在列列表的末尾:
Click
答案 0 :(得分:0)
作为替代方案,您可以将DataSource
设置为null
并将其设置回数据表:
dataGridView1.DataSource = null;
dataGridView1.DataSource = dt;
注意:当DataGridView
收到基础ListChange
的{{1}}事件时,它会检查更改是否是因为添加,删除或更改属性描述符,然后它调用一些有关更改数据源元数据的私有方法。如果您想阅读源代码,请启动here。