我在SO上看到很多帖子关于列的奇怪行为及其在刷新网格和动态构建列表中的列时的可见性,但是没有找到满意的解决方案。
经过一番挖掘后,我几乎可以肯定这个问题是由于使用了DataGridView.Columns.Clear()
方法。
到目前为止,我还没有弄清楚为什么但是当我动态构建我的DataGridView列时删除Clear()方法会阻止隐藏列出现,但我不明白为什么这会有任何影响?当然,如果你清除Columns集合并使用DataGridView.Columns.Add()
开始添加新的集合,代码就像;
dataGridView1.Columns.Clear(); // This is the offending method!!
dataGridView1.AutoGenerateColumns = false;
dataGridView1.ShowEditingIcon = false;
dataGridView1.RowHeadersVisible = false;
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "ID";
col.HeaderText = "ID";
col.Visible = false; // Notice the visibility of this column...
dataGridView1.Columns.Add(col);
... // Code is repeated for other columns in the collection
我看不出有什么问题但是如果开头包含dataGridView1.Columns.Clear();
我的隐藏列变得可见,肯定这是一个错误?
答案 0 :(得分:3)
我能够重现这个问题。 Clear
方法调用很好,您可以逐个删除列,但问题仍然存在。 "犯罪"打电话令人惊讶Add
:
col.Visible = false; // Notice the visibility of this column...
if (col.Visible)
{
// Just to be sure. Never get here.
}
dataGridView1.Columns.Add(col);
if (col.Visible)
{
// Surprise! We are here.
}
为什么会出现这种情况?
这绝对是一个错误。该问题仅在全部满足以下条件时才会发生:
DataGridView
处于绑定模式,即设置DataSource
。数据源类型并不重要。 Columns
收集为空Add
列调用Visible = false
方法
醇>
在这种情况下,代码会访问内部类DataGridViewDataConnection
方法MatchCurrencyManagerPosition
。看看source code,尤其是
// Treat case where columnIndex == -1. We change the visibility of the first column.
评论和评论后的代码块。
如何避免
总结一下,这只发生在数据绑定模式下,只有在第一个添加的列被设置为隐藏时才会发生。
所以有几种方法可以解决这个问题:
答案 1 :(得分:0)
这是因为数据表的DefaultView
被直接设置为gridview的数据源。
我们应该将datasource属性设置为DefaultView.ToTable()
,因为每当数据表被清除或重置时,它就会清除元数据,从而丢失网格的可见性信息。
现在真的无法确定为什么重置数据信息会影响DataGridViewColumn
的可见性。