如何在使用自定义DataSource时隐藏DataGridView的列?

我在c#中有一个小应用程序,它有一个使用以下内容填充的DataGridView:

grid.DataSource = MyDatasource array;

MyClass保存列的结构,它看起来像这样:

 class MyDatasource { private string column1; private string column2; public MyDatasource(string arg1, string arg2) { this.column1 = arg1; this.column2 = arg2; } public string column1 { get { return this.column1; } set { this.column1 = value; } } public string column2 { get { return this.column2; } set { this.column1 = value; } } } 

一切正常,DataGridView会填充正确的数据,但现在我想隐藏column2。 我尝试在列声明上面添加[Browsable(false)] ,这将隐藏它,但我还需要从代码中访问列值,当我使用[Browsable(false)]并尝试读取内容时,它会像如果列不存在。 如果我不使用它,我可以毫无问题地阅读该列,但它在DataGridView中可见。

我怎么能隐藏列但仍能从代码中读取其内容?

在某些情况下,首先将列添加到DataGridView然后隐藏它可能是个坏主意。

例如,我有一个类,它有一个NHibernate代理,用于公司徽标的Image属性。 如果我访问该属性(例如,通过调用其ToString方法在DataGridView中显示它),它将从SQL服务器下载图像。 如果我有一个Company对象列表并将其用作DataGridView的dataSource,那么(我怀疑)它会在我隐藏列之前下载所有徽标。

为了防止这种情况,我使用了自定义属性

  [System.ComponentModel.Browsable(false)] 

在image属性上,以便DataGridView忽略该属性(不创建列并且不调用ToString方法)。

  public class Company { ... [System.ComponentModel.Browsable(false)] virtual public MyImageClass Logo { get; set;} 

您必须在网格视图控件而不是数据源中隐藏列。 将其隐藏在数据源中它根本不会呈现给网格视图,因此您将无法访问网格视图中的值。 按照您的建议方式进行操作,您必须通过数据源而不是网格视图访问列值。

要隐藏网格视图控件上的列,可以使用如下代码:

 dataGridView1.Columns[0].Visible = false; 

要从数据源访问该列,您可以尝试以下方法:

 object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"]; 

我不确定它是否为时已晚,但问题在于,如果在运行时绑定,则无法在设计模式下设置列。因此,如果您在运行时绑定,请继续从设计模式中删除列,务实地做

恩..

  if (dt.Rows.Count > 0) { dataGridViewProjects.DataSource = dt; dataGridViewProjects.Columns["Title"].Width = 300; dataGridViewProjects.Columns["ID"].Visible = false; } 

我注意到,如果在panel1.Controls.Add(dataGridView);之前使用,如果在程序上使用它渲染不完整(整个表单根本不“绘制”任何东西panel1.Controls.Add(dataGridView); 然后是dataGridView.Columns["ID"].Visible = false; 将打破整个表格并使其成为空白,以便绕过设置此AFTER EG:

  panel1.Controls.Add(dataGridView); dataGridView.Columns["ID"].Visible = false; //works dataGridView.Columns["ID"].Visible = false; panel1.Controls.Add(dataGridView); //fails miserably 

设置该特定列的Visible property = false

dataGridView[ColumnName or Index].Visible = false;

编辑抱歉错过了Columns属性dataGridView.Columns[ColumnName or Index].Visible = false;

我有同样的问题

以下是可能适合您的解决方案。 它对我有用

  GridView1.DataBind(); if (GridView1.Columns.Count > 0) GridView1.Columns[0].Visible = false; else { GridView1.HeaderRow.Cells[0].Visible = false; foreach (GridViewRow gvr in GridView1.Rows) { gvr.Cells[0].Visible = false; } }