DataGridView ID列不会隐藏

本文关键字:隐藏 ID DataGridView | 更新日期: 2023-09-27 17:59:17

我有一个绑定到ObjectDataSource的DataGridView,其中一些列是隐藏的,包括ID列。问题是,即使ID列的可见属性设置为false,它也会显示出来。以前有人遇到过这个问题吗?将宽度设置为零不是一个选项,因为网格不允许宽度小于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;

我不知道我还能错过什么?

谢谢!

DataGridView ID列不会隐藏

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

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

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

为了更一般地回答下一个来的人,比如我…

这看起来确实是一个错误,但解决办法是:

确保要隐藏的列最后显示

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

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

我也有同样的问题。

下一行仍然使列可见,即使探究该值会显示为false。

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

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

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

将有问题的列DisplayIndex移到末尾,更正了此问题。

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

可能有点晚了,但我遇到了同样的问题,我有两个单独的表单,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似乎太早了。

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

这很奇怪。

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

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

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

我想贡献一个尚未提及的视角。

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

我认为它更干净、更直接,而且不太可能出错。我们还帮助编译器:)

这样,就不必使用DataGridView的属性名,也不必定位所需的列中介字符串(可能会被提交错误)。我的意思是:YourDataGridView.Column["YourColumn"]Property=AnyProperty。

我也遇到了同样的问题,以上都不适用。我的解决方案是至少为应该在设计器中的"编辑列"处隐藏的列设置一个DataPropertyName。

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

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

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

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列,因为它正在切换到可见。我以前只是使用它(在数学循环后隐藏ID列),但现在我添加了复选框列,我决定深入研究一下,现在我做到了。我还试着在从网格中抓取的列表中进行计算,当CKBox出现时,复选框列仍然会翻转到Visible。我仍然被第一个隐藏的列所困扰,想要翻转到可见,所以我重新隐藏了它。我确实将AutoGenerateColumns=False设置为False,并且将第一列的可见性也显式设置为False。两者都无济于事。

不知道是否有人仍在与这个问题作斗争。我遇到了同样的问题,正在dataSourceChanged事件中设置可见属性。

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