使用自定义数据源时如何隐藏 DataGridView 的列?

Posted

技术标签:

【中文标题】使用自定义数据源时如何隐藏 DataGridView 的列?【英文标题】:How to hide column of DataGridView when using custom DataSource? 【发布时间】:2011-10-21 02:29:37 【问题描述】:

我有一个 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 中可见。

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

【问题讨论】:

【参考方案1】:

尝试关注:

DataGridView1.Columns["YourColumnName"].Visible = false;

【讨论】:

【参考方案2】:

如果您想使用 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;

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

只需设置DataGridView.AutoGenerateColumns = false;

你需要点击右上角的箭头(datagridview)来添加列,在DataPropertyName你需要把你的属性的名字放在你的类中。

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

【讨论】:

".....您需要在您的班级中输入您的财产的名称。"....我发布:“您需要在班级中输入相同的财产名称。 ..." 如果我​​的班级有公共字符串名称 get;set; 那么你的 DataPropertyName 在列中应该有 "name" 值。【参考方案5】:

我注意到,如果以编程方式使用它会呈现不完整(整个表单根本不会“绘制”任何东西)如果在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

【讨论】:

【参考方案6】:

我遇到了同样的问题

这是可能对您有用的解决方案。它对我有用

    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;
    

【讨论】:

【参考方案7】:

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

【讨论】:

如果您使用的是您知道永远不想展示的房产,这绝对是最好的方式。 这是最好的答案。期间。 我以前在 Windows 窗体上使用过它,但不幸的是它不适用于 WPF 我会说那是 WPF 中的一个错误。我似乎记得几年前微软考虑停止 WPF - 因为那个我从来没有进入 WPF...【参考方案8】:

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

例如..

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

【讨论】:

【参考方案9】:

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

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

dataGridView1.Columns[0].Visible = false;

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

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

【讨论】:

控件创建后'Visible'为“ReadOnly”。【参考方案10】:

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

dataGridView[ColumnName or Index].Visible = false;

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

【讨论】:

以上是关于使用自定义数据源时如何隐藏 DataGridView 的列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?

隐藏视图时如何使用自动布局移动其他视图?

出现自定义侧菜单时如何隐藏状态栏的一部分

当在同一个单元格内单击按钮时,如何在自定义表格视图单元格内隐藏/显示特定视图

如何在我的自定义导航控制器中隐藏标签栏?

如何隐藏/显示自定义导航栏?