2

我有一个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;

但据我所知, row[X] 是对单元格(列)的访问,因此它与我的问题不匹配。

当我使用List<IECInstances>作为 DataSource 而不是 DataTable 时,属性 DataBoundItem 返回正确的对象。但实际上我不想将数据源设置为列表。

为了确保:当我谈论对象时,我的意思是我的 IECInstace 类型的业务对象。

4

1 回答 1

4

在我的第一个评论中,我假设对象实际上包含在Cells'Values中。在这种情况下,Cells显示对象类的ToString()方法返回的任何内容。'Value' 这个名字在这里有点误导,因为它可以容纳任何对象,并且与value vs reference types无关。

但是在我们的聊天中,我们已经确定您创建一个DataTable并通过 Linq 将对象的属性作为字符串填充到其中。

因此DataTable,以及绑定DataGridView仅包含字符串,而没有任何对对象的引用。

要解决这个问题,您必须以某种方式包含对原始对象实例的引用。

一种方法是在 中添加一个ColumnDataTable保存引用,可能是这样的:

 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为 a 中的列的另一种DataGridView方法是将它们放入 aList<T>中,这里是 a List<IECInstance >

当你这样做时,你可以将 DGV 设置DataSource到这个列表中

在这样的解决方案中,行直接与源对象相关联,您可以像这样在行级别上引用它:

IECInstance theObject = 
            dataGridView1.SelectedRows[0].DataBoundItem as IECInstance;

您可能希望通过包含BindingList 和/或BindingSource向绑定添加功能来插入一个或两个进一步级别的数据绑定。

于 2014-08-13T13:13:47.807 回答