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&lt;DataGridViewRow&gt;().Select(row =&gt; row.DataBoundItem as Pilots);

dgvPilots.SelectedRows.Cast&lt;DataGridViewRow&gt;().Select(row =&gt; (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&lt;Pilots&gt;()

【讨论】:

【参考方案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报表

从datagridview中删除所有选定的行

密码正确后从 DataGridView 中删除选定的行

c# DataGridView 从选定行获取单元格值

在为自定义 DataGridViewColumn 设置属性时访问 DataGridView 控件

csharp 从DataGridView获取选定的行