Datagridview如何将选定的行转换为自定义对象
Posted
技术标签:
【中文标题】Datagridview如何将选定的行转换为自定义对象【英文标题】:Datagridview how to cast selected row to custom object 【发布时间】:2014-06-24 13:43:22 【问题描述】:我将 c# winforms 与 MSSQL 数据库一起使用。 我在数据库“Pilots”中有表 ,我用 Pilots 表中的数据填充 datagridview “dgvPilots”。
dgvPilots.DataSource = Connection.dm.Pilots.ToList();
我启用了多选。 现在我需要从 datagridview 获取多选数据。 如何将多选行转换为“Pilots”对象并获取 PilotsID。
我当前的错误是“无法将对象类型 DataGridViewRow 转换为类型“.Data.Pilots”...
我也尝试像这样投射
dgvPilots.SelectedRows.Cast<Pilots>().ToList();
但它返回 DataGridViewRow 项目类型。
【问题讨论】:
请贴出datagridview的代码 你试过DataGridViewRow的DataBoundItem属性了吗? 【参考方案1】:这就是您可以在不显式迭代 SelectedRows 的情况下做到这一点的方法
dgvPilots.SelectedRows.Cast<DataGridViewRow>().Select(row => row.DataBoundItem as Pilots);
或
dgvPilots.SelectedRows.Cast<DataGridViewRow>().Select(row => (Pilots) row.DataBoundItem);
【讨论】:
【参考方案2】:不确定这是否仍然相关,但我发现了这一点:
IList<Pilots> pilots = (BindingList<Pilots>)((BindingSource)dataGridView1.DataSource).List;
【讨论】:
【参考方案3】:首先,等三年再等你的答案。
其次,请不要重复。
var selectedPilots =
(from DataGridViewRow cada in dgvPilots.SelectedRows select cada.DataBoundItem)
.Select(x => (Pilots)x).ToList();
【讨论】:
【参考方案4】:这个简单的通用扩展方法是我一直使用的:
public static List<T> ToList<T>(this DataGridViewSelectedRowCollection rows)
var list = new List<T>();
for (int i = 0; i < rows.Count; i++)
list.Add((T)rows[i].DataBoundItem);
return list;
使用:dgvPilots.SelectedRows.ToList<Pilots>()
【讨论】:
【参考方案5】:List<int> indexes = DataGrid1.SelectedRows.Cast<DataGridViewRow>().Select(x => x.Index).ToList();
foreach (i in indexes)
Pilots Pilot = (Pilots)DataGrid1.Rows[i].DataBoundItem;
【讨论】:
【参考方案6】:您将需要迭代集合并跟踪作为基础数据的 DataBoundItem 属性。
var pilots = new List<Pilots>(grid.SelectedRows.Count);
for(int index = 0; index < grid.SelectedRows.Count; index++)
var selectedRow = grid.SelectedRows[index];
var pilot = (Pilots)selectedRow.DataBoundItem;
pilots.Add(pilot);
上面的代码展示了如何实现这一点,(我写了代码,所以请原谅任何语法错误)。
这是关于 DataBoundItem 属性的 msdn 文章:http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.databounditem(v=vs.110).aspx
【讨论】:
【参考方案7】:我不知道你的数据库结构是什么,但是
var selectedPilots = dgvPilots.SelectedRows.Cast<Pilots>().ToList();
是正确的方法。但是,我确实怀疑 Pilots
在您的情况下是 DataTable
,您需要将这些项目转换为正确的 Class
类型 - 如果我必须拍摄,我会说您有一个 @ 987654325@(单数)类,你应该转换到。
【讨论】:
以上是关于Datagridview如何将选定的行转换为自定义对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在datagridview中显示选定的行到crystal报表