DataGridView ID列不会隐藏

时间:2011-06-15 14:22:31

标签: c# winforms datagridview

我有一个绑定到ObjectDataSource的DataGridView,其中一些列被隐藏,包括ID列。问题是,即使将其visible属性设置为false,ID列也会显示。有没有人遇到过这个问题?将宽度设置为零不是一个选项,因为网格不允许宽度小于5像素宽的列,因此无论如何它仍然会在网格上显示列。

奇怪的是ID列并不总是显示。我在应用程序上工作了一段时间后,列再次出现。

DataGridView未设置为自动生成列。我正在构建到.NET和C#的4.0版本。

以下是表单构造函数中的代码。

dgvActiveMiners.AutoGenerateColumns = false;
dgvAvilableMiners.AutoGenerateColumns = false;
dgvOperationResults.AutoGenerateColumns = false;

dgvActiveMiners.Columns["dgvActiveMinersRecordId"].Visible = false;
dgvAvilableMiners.Columns["dgvAvilableMinersRecordId"].Visible = false;
dgvOperationResults.Columns["dgvOperationResultRecordId"].Visible = false;

这是生成的网格代码。

this.dgvOperationResults.AllowUserToAddRows = false;
this.dgvOperationResults.AllowUserToDeleteRows = false;
this.dgvOperationResults.AutoGenerateColumns = false;
this.dgvOperationResults.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvOperationResults.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dgvOperationResultRecordId,
this.nameDataGridViewTextBoxColumn2,
this.typeIdDataGridViewTextBoxColumn,
this.amountDataGridViewTextBoxColumn,
this.operationIdDataGridViewTextBoxColumn});
this.dgvOperationResults.DataSource = this.operationResultBindingSource;
this.dgvOperationResults.Location = new System.Drawing.Point(12, 40);
this.dgvOperationResults.MultiSelect = false;
this.dgvOperationResults.Name = "dgvOperationResults";
this.dgvOperationResults.ReadOnly = true;
this.dgvOperationResults.Size = new System.Drawing.Size(498, 247);
this.dgvOperationResults.TabIndex = 16;

我不知道还有什么我可以错过的?

谢谢!

11 个答案:

答案 0 :(得分:17)

建议1:
尝试在FormLoad事件中明确将DGV列的Visible属性设置为false:

dataGridView.Columns["YourIdColumn"].Visible = false;

建议2:
尝试将列dgvActiveMinersRecordId从DGV中的第一列更改为最后一列。

答案 1 :(得分:10)

试着为下一个出现的人提供更多的回答,比如我......

这似乎是一个错误,但解决方法是:

确保最后显示要隐藏的列

这取决于您的代码,但对于某些人来说,这将是:

  • SQL代码已更改为稍后返回列
  • 更改添加datagridview列的代码,在末尾添加“隐藏”列
  • 根据@ Steve的帖子
  • 设置Columns[x].DisplayIndex以使列显示在最后

答案 2 :(得分:4)

也许有点晚了但是我遇到了同样的问题,我有两个单独的表格,DataGridViews都绑定到不同的DataTables。一个人没有问题隐藏第一列,另一个我尝试的一切都没有用, 直到 ......

注意:[“newCol”]是数据表中的第一个(即第0列)列。

此代码失败隐藏列[0](或按名称[“NewRow”])

...
MyDataGridView.DataSource = MyDatatable;
MyDataGridView.Columns["NewRow"].Visible = false;   // doesn't hide (col 0)
// MyDataGridView.Columns[0].Visible = false;  <<<< this didn't work either
MyDataGridView.Columns["Changed"].Visible = false;
MyDataGridView.Columns["Active"].Visible = false;
MyDatatable.RowFilter = "[Active] = 1";
...

此代码有效

...
MyDataGridView.DataSource = MyDatatable;
MyDatatable.RowFilter = "[Active] = 1";
MyDataGridView.Columns["NewRow"].Visible = false;   // YAY!! Now it hides
// MyDataGridView.Columns[0].Visible = false;       <<<< and this works too
MyDataGridView.Columns["Changed"].Visible = false;
MyDataGridView.Columns["Active"].Visible = false;
...

发现差异? 这是我指定RowFilter的地方。

另一种形式没有起始的RowFilter,但在两种形式中我稍后更改RowFilter(取决于用户操作),第0列永远不会返回。

似乎在隐藏列后很快就为列0指定了RowFilter。

非常非常奇怪!!!!非常非常令人沮丧!!!!

答案 3 :(得分:3)

我有同样的问题。

以下行仍然保持列可见,即使探索该值也显示为false。

dataSelected.Columns["id"].Visible = false;

我没有这个问题,直到我在列

上设置了DisplayIndex
dataSelected.Columns["ipagenum"].DisplayIndex = 6;

将违规列DisplayIndex移至最后,更正了此问题。

dataSelected.Columns["id"].DisplayIndex = 15;

答案 4 :(得分:2)

我想提供一个尚未提及的观点。

DataGridView的每一列都有一个属性名称。您可以按名称直接访问列,就像访问任何其他元素一样。例如:ColumnName.Property = AnyProperty。在您的情况下:ColumnName.Visible = false。

我认为它更清洁,更直接,更不容易犯错误。我们也帮助编译器:)

通过这种方式,没有必要使用DataGridView的属性名称,也没有找到所需的列调解字符串(可能会被提交) 一个错误)。我的意思是:YourDataGridView.Columns [“YourColumn”] Property = AnyProperty。

答案 5 :(得分:1)

那很奇怪。

您确定要调用正确的列名吗?我意识到这将是一个愚蠢的错误,但它发生了!

这是一个你可以尝试的简单测试:

void test(string columnName, bool visibility) {
  if (dataGridView1.Columns.Contains(columnName)) {
    dataGridView1.Columns[columnName].Visible = visibility;
  } else {
    throw new Exception(string.Format("Column '{0}' does not exist in DataGridView '{1}'.", columnName, dataGridView1.Name));
  }
}

答案 6 :(得分:0)

我遇到了同样的问题,以上都没有为我工作。我的修复是至少为应该在“编辑列”中的设计器中隐藏的列设置DataPropertyName。

答案 7 :(得分:0)

如果要按名称隐藏列,则必须在列中指定名称。初始化属性名称,然后按代码使用它。

答案 8 :(得分:0)

我遇到了同样的问题,并且我不想将id列的索引更改为visible属性。因此,我注意到在指示ID为column visible = false之后,我正在删除 DataGridView 的最后一行,这就是使id列出现的原因。因此,我先删除该行,然后指出ID column = false

答案 9 :(得分:0)

我有类似的问题。我在数据绑定网格中添加了一个未绑定的复选框列。它成为第一栏。 当我这样步入网格时:

for (int i = 0; i < grvQuoteCostSheets.RowCount; i++)
{
   grvQuoteCostSheets[grcQCostSProfit.Index, i].Value
      = (Convert.ToInt32(grvQuoteCostSheets[grcQCostSPrice.Index, i].Value) - Convert.ToInt32(grvQuoteCostSheets[grcQCostSTotalCost.Index, i].Value));
}
idColumn.Visible = false;   //Need to rehide.

第一个隐藏列的可见性切换为False。我按照另一个答案的建议将CKBox列从第一位移到了第三位(接下来的两列分别是ID值和Line#,并且已隐藏),而复选框列保持隐藏状态。我在数学之后隐藏了ID列,因为它转向了Visible。我只是之前使用过它(在数学循环后隐藏ID列),但是现在我添加了复选框列,所以我决定再做一点工作,就在这里。 我还尝试在从网格中获取的列表中进行数学运算,并且当CKBox首次出现时,复选框列仍会变为可见。我仍然停留在第一个隐藏列想要翻到可见的位置,因此我将其重新隐藏。 我确实有AutoGenerateColumns = False,并且明确地将第一列可见性也设置为false。两者都无济于事。

答案 10 :(得分:0)

不知道是否有人还在为这个问题而苦苦挣扎。 我遇到了同样的问题,正在 dataSourceChanged 事件中设置可见属性。

当我在 show 事件中放置可见的 false 时,它​​起作用了。