【问题标题】:How to get the selected object from the DataGridView?如何从 DataGridView 中获取选定的对象?
【发布时间】:2014-10-06 14:10:02
【问题描述】:

我有一个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 返回正确的对象。但实际上我不想将 DataSource 设置为 List。

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

【问题讨论】:

  • dataGridView.SelectedRows[0].Cells[0].Value as IECInstance 等有什么问题?或dataGridView.SelectedCells[0].Value as IECInstance
  • 我想要行中的对象,而不仅仅是单元格中的值。
  • 但单元格中的值将是表中的对象。而行只是单元格的集合
  • 所以 DataTable 不能容纳对象?只是价值观?我认为一排是一个对象。而一个单元格只是对象的一个​​属性。
  • 不,不,值对象。不要让单词“值”欺骗您,它们是任何数据类型的真实对象。与值与引用类型无关..!

标签: c# winforms datagridview datatable datarowview


【解决方案1】:

在我的第一个 cmets 中,我假设对象实际上包含在 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 来插入一个或两个进一步级别的数据绑定,从而为绑定添加功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2015-10-10
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多