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

时间:2011-08-05 18:09:34

标签: c# .net datagrid datagridview datagridviewcolumn

我在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中可见。

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

9 个答案:

答案 0 :(得分:39)

在某些情况下,首先将列添加到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;}

答案 1 :(得分:38)

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

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

dataGridView1.Columns[0].Visible = false;

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

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

答案 2 :(得分:6)

我注意到如果在程序上使用它会渲染不完整(整个表单根本不“绘制”任何东西)如果在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

答案 3 :(得分:5)

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

离..

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

答案 4 :(得分:2)

设置该特定列的Visible属性= false

dataGridView[ColumnName or Index].Visible = false;

修改 抱歉错过了Columns财产 dataGridView.Columns[ColumnName or Index].Visible = false;

答案 5 :(得分:1)

我遇到了同样的问题

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

    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;
    }
}

答案 6 :(得分:0)

只需设置DataGridView.AutoGenerateColumns = false;

您需要单击右上角的箭头(在datagridview中添加列,在DataPropertyName中,您需要在类中添加属性的名称。

然后,在datagridview中定义列之后,可以设置datagridview.datasource = myClassViewModel

答案 7 :(得分:0)

MyDataGridView.RowHeadersVisible = False; 在绑定和重命名每列标题并设置列宽之前。 为了在我搜索时帮助我失败的记忆,因为我会搜索......这是肯定的;-)

答案 8 :(得分:0)

如果您想使用 BrowsableAttribute,那么您可以在运行时在模型上查找它并相应地隐藏该列:

private void Form_Load(object sender, EventArgs e)
{
    //add this line after your DataGridView initialization
    HideColumns<MyModel>(myDvg);
}

private void HideColumns<T>(DataGridView dvg)
{
    var type = typeof(T);
    foreach (var column in dvg.Columns.Cast<DataGridViewColumn>())
        column.Visible = IsBrowsable(type.GetProperty(column.Name));
}

private bool IsBrowsable(PropertyInfo propertyInfo)
{
    var attribute = propertyInfo.GetCustomAttributes(true).FirstOrDefault(att => att.GetType() == typeof(BrowsableAttribute));
    return attribute == null || (attribute as BrowsableAttribute).Browsable;
}