我在MSSQL数据库中使用c#winforms。 我在数据库“Pilots”中有表 ,我使用Pilots表中的数据填充datagridview“dgvPilots”。
dgvPilots.DataSource = Connection.dm.Pilots.ToList();
我启用了多选。 现在我需要从datagridview获取多选数据。 如何将多选行转换为“Pilots”对象并获取PilotsID。
我当前的错误是“无法将对象类型DataGridViewRow转换为类型”.Data.Pilots“...
我也尝试像这样投射
dgvPilots.SelectedRows.Cast<Pilots>().ToList();
但它返回DataGridViewRow项类型。
答案 0 :(得分:16)
您将需要迭代集合并继续处理作为基础数据的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
答案 1 :(得分:5)
我不知道你的数据库结构是什么,但是
var selectedPilots = dgvPilots.SelectedRows.Cast<Pilots>().ToList();
是正确的方法。但是我怀疑Pilots
在你的情况下是DataTable
,你需要的是将这些项目投射到正确的Class
类型 - 如果我必须拍摄,我&# 39; d说你有一个Pilot
(单数)课程,你应该投入。
答案 2 :(得分:1)
List<int> indexes = DataGrid1.SelectedRows.Cast<DataGridViewRow>().Select(x => x.Index).ToList();
foreach (i in indexes)
{
Pilots Pilot = (Pilots)DataGrid1.Rows[i].DataBoundItem;
}
答案 3 :(得分:1)
这个简单的通用扩展方法是我一直使用的方法:
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>()
答案 4 :(得分:1)
首先,等待三年的答案。
其次,请不要迭代。
var selectedPilots =
(from DataGridViewRow cada in dgvPilots.SelectedRows select cada.DataBoundItem)
.Select(x => (Pilots)x).ToList();
答案 5 :(得分:0)
不确定这是否仍然有用,但是我发现了这一点:
IList<Pilots> pilots = (BindingList<Pilots>)((BindingSource)dataGridView1.DataSource).List;
答案 6 :(得分:0)
这是您无需显式遍历SelectedRows即可完成的操作
dgvPilots.SelectedRows.Cast<DataGridViewRow>().Select(row => row.DataBoundItem as Pilots);
或
dgvPilots.SelectedRows.Cast<DataGridViewRow>().Select(row => (Pilots) row.DataBoundItem);