隐藏带有列表的DataGridView中的列<>作为数据源
本文关键字:数据源 列表 DataGridView 隐藏 | 更新日期: 2023-09-27 18:13:45
我有一个class X
的List<>
X
有3列:a
, b
和c
。
现在我将List绑定到DataGridView
:
dataGrid.DataSource = list;
如何在GridView
中只显示列a和c
,因此隐藏列b
?
如果可能,我将不编辑列表本身,如果可能,也不生成一个新列表。
这里有解决方案吗?
我假设你的类是这样的:
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;
}
}