我有一个 System.Windows.Forms.DataGridView
显示我的类型的对象 IECInstance
.
我正在构建一个 DataTable
并用我的对象填充表并将 DataTable 设置为我的 DataGridView 的数据源。所以我的 DataGridView 正确显示了我的对象。
我现在的问题是在我选择行时获取对象。
我的第一次尝试是使用这个:
IECInstance theObjectIWant = dataGridView.SelectedRows[0].DataBoundItem as IECInstance.
但是DataBountItem
返回 DataRowView
.
所以我在 SO 上发现了很多关于这个问题的问题,有些人建议使用这个:
var drv = dataGridView1.SelectedRows[0].DataBoundItem as DataRowView;
var row = drv.Row as DataRow;
var val = row[X] as MyType;
但据我所知,row[X] 是对单元格(列)的访问,因此它与我的问题不匹配。
当我使用 List<IECInstances>
时作为 DataSource 而不是 DataTable,属性 DataBoundItem 返回正确的对象。但实际上我不想将数据源设置为列表。
要确保:当我谈论对象时,我指的是我的 IECInstace 类型的业务对象。
最佳答案
在我的第一条评论中,我假设对象实际上包含在 Cells
中。 ' Values
.在这种情况下 Cells
显示对象类的 ToString()
方法返回。 “值”这个名称在这里有点误导,因为它可以容纳任何对象,并且与值与引用类型无关。
但在我们的聊天中,我们确定您创建了一个 DataTable
并通过 Linq 将对象的属性作为字符串填充到其中。
所以 DataTable
以及绑定(bind) DataGridView
仅包含字符串,不包含对对象的任何引用。
要解决此问题,您必须以某种方式包含对原始对象实例的引用。
一种方法是添加 Column
到 DataTable
持有引用,可能是这样的:
dataGridView1.Columns.Add("hIECInstance", typeof(IECInstance ));
并用对象引用填充它,方法是将其包含在 Linq 结果集中或将其包含在 Add()
的列列表中。命令或单独设置。
要隐藏引用,您可以将 DGV 中的列设置为不可见。
dataGridView1.Columns["hIECInstance"].Visible = false;
..并访问你转换的对象 Value
到你的对象类:
IECInstance theObject =
dataGridView1.SelectedRows[0].Cells["hIECInstance"].Value as IECInstance;
另一种显示对象的方式Properties
作为 DataGridView
中的列就是把它们放到一个List<T>
, 这里是 List<IECInstance >
.
当你这样做时,你可以设置 DGV 的 DataSource
到这个列表
在这样的解决方案中,行直接与源对象相关联,您可以像这样在行级别引用它:
IECInstance theObject =
dataGridView1.SelectedRows[0].DataBoundItem as IECInstance;
您可能希望通过包含 BindingList
来插入一个或两个进一步的数据绑定(bind)级别和/或 BindingSource
从而为绑定(bind)添加功能。
关于c# - 如何从 DataGridView 中获取选中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282391/