我有一个System.Windows.Forms.DataGridView
来显示我的IECInstance
类型的对象。
我正在构建一个DataTable
和填充表与我的对象和设置DataTable作为我的DataGridView的数据源。DataGridView正确显示了我的对象。
我的问题是现在得到的对象,当我选择行(s)。
我的第一次尝试是使用这个:
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>
作为数据源而不是数据表时,属性DataBoundItem返回适当的对象。但实际上我不想把数据源设置为一个列表。
要确保:当我谈论对象时,我指的是iecinstance类型的业务对象。
在我的第一个评论中,我假设对象实际上包含在Cells
' Values
中。在这种情况下,Cells
显示对象类的ToString()
方法返回的任何内容。"Value"这个名字在这里有点误导,因为它可以保存任何对象,并且与值和引用类型无关。
但是在我们的聊天中,我们已经建立了你创建一个DataTable
,并通过Linq对象的属性作为字符串填充它。
所以DataTable
和绑定的DataGridView
只包含字符串,没有任何指向对象的引用。
要解决这个问题,你必须以某种方式包含对原始对象实例的引用。
一种方法是在DataTable
上添加Column
来保存引用,可能像这样:
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
和/或BindingSource
来插入一个或两个进一步的dataBinding级别,从而向绑定添加功能。