xon*_*ned 3 c# datatable datarowview datagridview winforms
我有一个System.Windows.Forms.DataGridView来展示我类型的对象IECInstance。
我正在构建一个DataTable表并用我的对象填充表,并将 DataTable 设置为我的 DataGridView 的数据源。所以我的 DataGridView 正确显示了我的对象。
我现在的问题是在选择行时获取对象。
我的第一次尝试是使用这个:
IECInstance theObjectIWant = dataGridView.SelectedRows[0].DataBoundItem as IECInstance.
Run Code Online (Sandbox Code Playgroud)
但DataBountItem返回一个DataRowView. 所以我在这里发现了很多关于这个问题的问题,有些人建议使用这个:
var drv = dataGridView1.SelectedRows[0].DataBoundItem as DataRowView;
var row = drv.Row as DataRow;
var val = row[X] as MyType;
Run Code Online (Sandbox Code Playgroud)
但据我所知,行[X]是对单元格(列)的访问,所以它与我的问题不匹配。
当我使用 aList<IECInstances>作为数据源而不是 DataTable 时,属性 DataBoundItem 返回正确的对象。但实际上我不想将数据源设置为列表。
为了确保:当我谈论对象时,我指的是 IECInstace 类型的业务对象。
在我的第一个评论中,我假设对象实际上包含在Cells'中Values。在这种情况下,将Cells显示对象类的ToString()方法返回的任何内容。“值”这个名称在这里有点误导,因为它可以保存任何对象,并且与值类型和引用类型无关。
但在我们的聊天中,我们已经确定您可以创建一个DataTable并通过将对象的属性作为字符串连接到其中来填充它。
因此,DataTable以及绑定DataGridView仅包含字符串,而不包含任何对对象的引用。
要解决该问题,您必须以某种方式包含对原始对象实例的引用。
一种方法是添加一个Column来DataTable保存引用,也许像这样:
dataGridView1.Columns.Add("hIECInstance", typeof(IECInstance ));
Run Code Online (Sandbox Code Playgroud)
并用对象引用填充它,方法是将其包含在 Linq 结果集中,或者将其包含在命令的列列表中,Add()或者单独设置。
要隐藏参考,您可以将 DGV 中的列设置为不可见。
dataGridView1.Columns["hIECInstance"].Visible = false;
Run Code Online (Sandbox Code Playgroud)
..并访问您将其转换Value为对象类的对象:
IECInstance theObject =
dataGridView1.SelectedRows[0].Cells["hIECInstance"].Value as IECInstance;
Run Code Online (Sandbox Code Playgroud)
将对象显示Properties为 a 中的列的另一种DataGridView方法是将它们放入 a 中List<T>,此处为 a List<IECInstance >。
执行此操作后,您可以将 DGV 设置DataSource到此列表
在这样的解决方案中,行直接与源对象关联,您可以在行级别引用它,如下所示:
IECInstance theObject =
dataGridView1.SelectedRows[0].DataBoundItem as IECInstance;
Run Code Online (Sandbox Code Playgroud)
您可能希望通过包含BindingList 和/或BindingSource向绑定添加功能来插入一层或两层更多的数据绑定。
| 归档时间: |
|
| 查看次数: |
4504 次 |
| 最近记录: |