31

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

我怎样才能隐藏列但仍然能够从代码中读取其内容?

4

10 回答 10

49

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

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

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

 [System.ComponentModel.Browsable(false)]

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

 public class Company
 {
     ...
     [System.ComponentModel.Browsable(false)]
     virtual public MyImageClass Logo { get; set;}
于 2013-01-18T07:19:56.170 回答
41

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

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

dataGridView1.Columns[0].Visible = false;

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

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
于 2011-08-05T18:29:39.613 回答
6

我注意到,如果以编程方式使用它会呈现不完整(整个表单根本不会“绘制”任何东西),如果在此之前使用panel1.Controls.Add(dataGridView);dataGridView.Columns["ID"].Visible = false;破坏整个表单并使其变为空白,因此要绕过在 EG 之后设置此设置:

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

 dataGridView.Columns["ID"].Visible = false; 
 panel1.Controls.Add(dataGridView);
 //fails miserably
于 2016-08-03T11:17:59.140 回答
5

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

前任..

     if (dt.Rows.Count > 0)
    {
        dataGridViewProjects.DataSource = dt;
        dataGridViewProjects.Columns["Title"].Width = 300;
        dataGridViewProjects.Columns["ID"].Visible = false;
    }
于 2012-12-10T17:21:45.990 回答
3

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

dataGridView[ColumnName or Index].Visible = false;

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

于 2011-08-05T18:27:05.290 回答
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;
    }
}
于 2013-04-15T12:03:31.903 回答
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;
}
于 2021-02-21T22:19:23.327 回答
0

只需设置DataGridView.AutoGenerateColumns = false

您需要单击右上角的箭头 (in datagridview) 来添加列,并且DataPropertyName您需要在类中输入您的属性的名称。

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

于 2019-04-26T14:18:55.623 回答
0

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

于 2021-01-16T19:37:52.063 回答
0

尝试跟随:

DataGridView1.Columns["YourColumnName"].Visible = false;
于 2021-11-14T08:05:26.287 回答