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

mgl*_*log 28 .net c# 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Alg*_*man 42

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

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

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

 [System.ComponentModel.Browsable(false)]
Run Code Online (Sandbox Code Playgroud)

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

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


Jam*_*son 40

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

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

dataGridView1.Columns[0].Visible = false;
Run Code Online (Sandbox Code Playgroud)

要从数据源访问列,您可以尝试这样的事情:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
Run Code Online (Sandbox Code Playgroud)


Mr *_*lis 6

我注意到,如果使用progrmmatically它呈现不完整的(整个形式根本不"画"任何东西),如果使用之前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
Run Code Online (Sandbox Code Playgroud)


Seb*_*ldi 5

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

恩..

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


Har*_*san 3

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

dataGridView[ColumnName or Index].Visible = false;

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