我在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"];
我注意到,如果使用progrmmatically它渲染不完整(整个形式根本不“绘制”任何东西)如果在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
我不确定它是否为时已晚,但问题是,如果您在运行时绑定,则无法在设计模式下设置列。因此,如果您在运行时绑定,请继续从设计模式中删除列,务实地做
恩..
if (dt.Rows.Count > 0)
{
dataGridViewProjects.DataSource = dt;
dataGridViewProjects.Columns["Title"].Width = 300;
dataGridViewProjects.Columns["ID"].Visible = false;
}
设置该特定列的Visible
属性= 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;
}
}
只需设置DataGridView.AutoGenerateColumns = false
;
您需要单击右上角的箭头(在datagridview
中)添加列,在DataPropertyName
中,您需要在您的类中添加您的属性的名称。
然后,在datagridview
中定义列后,可以设置datagridview.datasource = myClassViewModel
。