【问题标题】:Hide Columns in a DataGridView with a List<> as DataSource?使用 List<> 作为 DataSource 隐藏 DataGridView 中的列?
【发布时间】:2011-11-08 17:40:06
【问题描述】:

我有一个List&lt;&gt; 和一个class X

X 有 3 列:abc

现在我将 List 绑定到DataGridView:

dataGrid.DataSource = list;

GridView中如何只显示a列和c,所以隐藏b列?

如果可能,我不会编辑列表本身,也不会生成新列表(如果可能)。

这里有什么解决办法吗?

【问题讨论】:

    标签: c# gridview datagridview


    【解决方案1】:

    我假设你的班级是这样的:

    private class MyClass
    {
      [DisplayName("Foo/Bar")]
      public string FooBar { get; private set; }
    
      [Browsable(false)]
      public decimal Baz { get; private set; }
    
      [DisplayName("Baz")]
      public CurrencyBaz => string.Format(Baz, "C2");
    }
    

    在上面的代码中,gridview 的列名是这样的

    • 列名1:("Foo/Bar")
    • 列名2:"Baz"
    • 列名3:"CurrencyBaz"

    如果您不想显示该列,您可以添加此属性: [Browsable(false)]

    上面代码中列名2没有显示......

    希望对你有帮助……

    【讨论】:

    • 太好了,谢谢。不知道这个属性!
    【解决方案2】:

    隐藏列会起作用,但会使 DataGridView 更难使用。我认为你最好不要添加列。为了实现这一点,我喜欢为我的对象创建一个接口,该接口只公开我希望在 DataGridView 中可见的字段,然后绑定到接口而不是对象。

    public interface IMyBindingObject
    {
        string A { get; set; }
        string C { get; set; }
    }
    
    
    public class MyObject : IMyBindingObject
    {
        public MyObject(string a, string b, string c)
        {
            A = a;
            B = b;
            C = c;
        }
        public string A { get; set; }
        public string B { get; set; }
        public string C { get; set; }
    }
    
    
    private void Form1_Load(object sender, EventArgs e)
    {
        List<IMyBindingObject> obj = new List<IMyBindingObject>();
        obj.Add(new MyObject("Test A", "Test B", "Test C"));
        obj.Add(new MyObject("T A", "T B", "T C"));
    
        dataGridView1.AutoGenerateColumns = true;
        dataGridView1.DataSource = obj;
    }
    

    【讨论】:

      【解决方案3】:

      您需要:

      dataGrid.AutoGenerateColumns = false;
      

      然后,您需要为每个类 X 的成员添加一列,并将它们数据绑定。

      【讨论】:

        【解决方案4】:

        或按名称隐藏列

        dgvEmployees.DataSource = data
        dgvEmployees.Columns("Id").Visible = False
        dgvEmployees.Columns("ElementEtat").Visible = False
        

        【讨论】:

          【解决方案5】:

          你需要做的基本的东西,

          首先将 AutoGenerateColumns 属性设置为 False

          dataGrid.AutoGenerateColumns = false;
          

          在 RowDataBound 事件之后你会这样做

          protected void dataGrid_RowDataBound(object sender, GridViewRowEventArgs e)
                  {
                      if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType==DataControlRowType.Header)
                      {
          
                          e.Row.Cells[index of the cell to hide].Visible =false;
          
                      }
                  }
          

          【讨论】:

            猜你喜欢
            • 2012-10-25
            • 2016-02-07
            • 1970-01-01
            • 1970-01-01
            • 2011-08-13
            • 1970-01-01
            • 1970-01-01
            • 2013-05-19
            • 2013-08-11
            相关资源
            最近更新 更多