【问题标题】:Datagridview how to cast selected row to custom objectDatagridview如何将选定的行转换为自定义对象
【发布时间】: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属性了吗?

标签: c# sql-server winforms


【解决方案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@(单数)类,你应该转换到。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-02-15
                • 1970-01-01
                • 2011-01-15
                • 2014-04-17
                • 2018-05-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多