我有一个绑定到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;
我不知道还有什么我可以错过的?
谢谢!
答案 0 :(得分:17)
建议1:
尝试在FormLoad事件中明确将DGV列的Visible属性设置为false:
dataGridView.Columns["YourIdColumn"].Visible = false;
建议2:
尝试将列dgvActiveMinersRecordId从DGV中的第一列更改为最后一列。
答案 1 :(得分:10)
试着为下一个出现的人提供更多的回答,比如我......
这似乎是一个错误,但解决方法是:
确保最后显示要隐藏的列
这取决于您的代码,但对于某些人来说,这将是:
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;
我没有这个问题,直到我在列
上设置了DisplayIndexdataSelected.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 时,它起作用了。