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
。