为什么在调用DataGridView.Columns.Clear()之后Columns不会保持隐藏状态?

时间:2012-11-19 12:48:18

标签: c# .net datagridview visibility datagridviewcolumn

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

2 个答案:

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

为什么会出现这种情况?

这绝对是一个错误。该问题仅在全部满足以下条件时才会发生:

  1. DataGridView处于绑定模式,即设置DataSource。数据源类型并不重要。
  2. Columns收集为空
  3. 使用Add 列调用
  4. Visible = false方法

    在这种情况下,代码会访问内部类DataGridViewDataConnection方法MatchCurrencyManagerPosition。看看source code,尤其是

    // 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。创建并添加所有列,然后隐藏所需的列。

答案 1 :(得分:0)

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

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

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