DataGridView ID列不会隐藏

我有一个绑定到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; 

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

谢谢!

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

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

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

为了下一个跟我一起来的人,比如我更喜欢尝试回答这个问题……

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

确保最后显示要隐藏的列

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

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

也许有点晚了,但是我遇到了同样的问题,我有两个单独的表格,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的地方。

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

似乎在隐藏列后很快指定RowFilter对于列0失败。

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

我有同样的问题。

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

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

我没有这个问题,直到我在列上设置了DisplayIndex

 dataSelected.Columns["ipagenum"].DisplayIndex = 6; 

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

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

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

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

我认为它更干净,更直接,也不太可能犯错误。 我们也帮助了一下编译器:)

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

那很奇怪。

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

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

 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)); } } 

我有同样的问题,上面没有一个对我有用。 我的修复是至少为应该在“编辑列”中的设计器中隐藏的列设置DataPropertyName。

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

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