隐藏带有列表的DataGridView中的列<>作为数据源

本文关键字:数据源 列表 DataGridView 隐藏 | 更新日期: 2023-09-27 18:13:45

我有一个class XList<>

X有3列:a, bc

现在我将List绑定到DataGridView:

dataGrid.DataSource = list;

如何在GridView中只显示列a和c,因此隐藏列b ?

如果可能,我将不编辑列表本身,如果可能,也不生成一个新列表。

这里有解决方案吗?

隐藏带有列表的DataGridView中的列<>作为数据源

我假设你的类是这样的:

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的列名是这样的

  • 列名e1: ("Foo/Bar")
  • 列名e2: "Baz"
  • 列名3:"CurrencyBaz"

如果你不想显示列,你可以添加这个属性: [Browsable(false)]

在上面的代码中列名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;
}

您需要:

dataGrid.AutoGenerateColumns = false;

然后您需要为每个类X的成员添加一列并将其绑定。

或按名称隐藏列

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

你需要做的基本的东西,

第一次设置autogenerateccolumns属性为False

dataGrid.AutoGenerateColumns = false;

之后在rowdataboundevent中你可以这样做

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