我有System.Windows.Forms.DataGridView
来显示我的类型IECInstance
的对象。
我正在构建一个DataTable
并用我的对象填充表格,并将DataTable设置为我的DataGridView的DataSource。所以我的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;
但是我可以看到,行[X]是对单元格(列)的访问,因此它与我的问题不匹配。
当我使用List<IECInstances>
作为DataSource而不是DataTable时,属性DataBoundItem返回正确的对象。但实际上我并不想将DataSource设置为List。
确保:当我谈论对象时,我指的是IECInstace类型的业务对象。
答案 0 :(得分:4)
在我的第一条评论中,我假设对象实际上包含在Cells
'Values
中。在这种情况下,Cells
显示对象类的ToString()
方法返回的内容。 “Value”这个名称在这里有点误导,因为它可以容纳任何对象,与 value vs reference types 无关。
但是在我们的聊天中,我们已经确定您创建了一个DataTable
并通过Linq将对象的属性填充为字符串。
因此DataTable
以及绑定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 >
。< / p>
当您这样做时,您可以将DGV的DataSource
设置为此列表
在这样的解决方案中,行直接与源对象关联,您可以在行级别引用它,如下所示:
IECInstance theObject =
dataGridView1.SelectedRows[0].DataBoundItem as IECInstance;
您可能希望通过包含BindingList
和/或BindingSource
来插入一个或两个更多级别的dataBinding,从而为绑定添加功能。