4

我在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();包含在开头,我的隐藏列变得可见,这肯定是一个错误吗?

4

2 回答 2

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.
}

为什么会出现这种行为?

这绝对是一个错误。仅当满足以下所有条件时才会发生此问题

  1. DataGridView处于绑定模式,即已DataSource设置。数据源类型无关紧要。
  2. Columns集合为空
  3. Add使用具有的列调用方法Visible = false

在这种情况下,代码会遇到一个内部类DataGridViewDataConnection方法MatchCurrencyManagerPosition。看看源代码,尤其是

// Treat case where columnIndex == -1. We change the visibility of the first column.

注释和该注释之后的代码块。

如何避免它

回顾一下,这仅在数据绑定模式下发生,并且仅适用于第一个添加的列(如果它设置为隐藏)。

所以有几种方法可以解决这个问题:

  1. 重新填充列时确保网格未处于绑定模式

    var dataSource = dataGridView.DataSource;
    dataGridView.DataSource = null;
    // Repopulate columns
    //...
    dataGridView.DataSource = dataSource;
    
  2. 不要使用Add方法。创建所有列并将它们保存在变量或临时列表中,最后使用AddRange没有这种效果的方法。

  3. 不要Visible = false提前设置。创建并添加所有列,然后隐藏所需的列。

于 2016-07-03T09:07:04.820 回答
0

这是因为数据表DefaultView被直接设置为 gridview 的数据源。

我们应该将 datasource 属性设置为,DefaultView.ToTable()因为每当数据表被清除或重置时,它都会清除元数据,从而丢失网格的可见性信息。

现在这真的是无法确定为什么重置数据表信息会影响DataGridViewColumn的可见性。

于 2014-11-07T14:13:23.593 回答