c# - 如何从 DataGridView 中获取选中的对象?

标签 c# winforms datagridview datatable datarowview

我有一个 System.Windows.Forms.DataGridView显示我的类型的对象 IECInstance .

我正在构建一个 DataTable并用我的对象填充表并将 DataTable 设置为我的 DataGridView 的数据源。所以我的 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 类型的业务对象。

最佳答案

在我的第一条评论中,我假设对象实际上包含在 Cells 中。 ' Values .在这种情况下 Cells显示对象类的 ToString()方法返回。 “值”这个名称在这里有点误导,因为它可以容纳任何对象,并且与值与引用类型无关。

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

所以 DataTable以及绑定(bind) 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作为 DataGridView 中的列就是把它们放到一个List<T> , 这里是 List<IECInstance > .

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

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

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

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

关于c# - 如何从 DataGridView 中获取选中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282391/

相关文章:

c# - 如何找到所有静态构造函数?

c# - AOP Postsharp,记录变量值

c# - winform控件如何随着窗体展开等量展开

c# - 如何更改Datagridview行标题

c# - 如何在 C# 中保存此表?

c# - 用单声道编译cs文件?

c# - 如何在 Visual Studio 中连接到 Sqlite 并创建数据库?

c# - Datagridview 添加工具提示

c# - 如何将文件拖放到 DataGridView 并将文件名记录到单元格 C# 中?

c# - DataGridView 列数据到数组