如何从DataGridView中获取选定的对象



我有一个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级别,从而向绑定添加功能。

相关内容

  • 没有找到相关文章

最新更新