【问题标题】:Why do Columns not stay hidden after calling DataGridView.Columns.Clear()?为什么调用 DataGridView.Columns.Clear() 后 Columns 不保持隐藏状态?
【发布时间】:2012-11-07 09:30:39
【问题描述】:

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

【问题讨论】:

  • 添加列后是否尝试过dataGridView1.Invalidate()?
  • 我确实用Refresh() 尝试了很长一段时间,这或多或少是一回事。行为方式相同...
  • 我设法绕过它的唯一方法是停止动态重建我的列列表,这并不理想(只需在表单加载时加载我的列创建方法),因为我想显示不同的结果有不同的标准。
  • 你有没有尝试过一些类似空数据表到你的datagridview的东西,比如DataTable dtEmpty=new DataTable(); dataGridView1.DataSource = dtEmpty;或简单的dataGridView1.DataSource = null
  • 我喜欢这个被否决的方式,我提供了我能提供的所有信息,并试图让问题尽可能清晰。关于我可以做得更好的一点反馈会很好。

标签: c# .net datagridview visibility datagridviewcolumn


【解决方案1】:

我能够重现该问题。 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. 使用具有Visible = false 的列调用Add 方法

在这种情况下,代码会遇到内部类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。创建并添加所有列,然后隐藏所需的列。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我一定会看看是否有帮助。
    • 回到这个只是因为我正在经历我的旧问题并意识到这没有帮助。原因是在重建我的列之前调用.Clear(),并在将其添加到Columns 集合之前显式设置为Visible = false,因此虽然旧的元数据已经消失,但我正在创建新的元数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多