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;
我不知道我还能错过什么?
谢谢!
建议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事件中时,它起了作用。