如何从DataGridView获取所选对象?

时间:2014-08-13 09:14:14

标签: c# winforms datagridview datatable datarowview

我有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类型的业务对象。

1 个答案:

答案 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,从而为绑定添加功能。