【问题标题】:How to use LINQ query with DataGridView but a subset of table columns?如何将 LINQ 查询与 DataGridView 但表列的子集一起使用?
【发布时间】:2015-02-20 00:10:15
【问题描述】:

我正在尝试从MSDN 的代码示例中学习,但我显然不了解 LINQ 的真正工作原理。我想做的是用强类型数据集的表中可用列的子集填充“查找窗口”的 DataGridView。我正在尝试以下操作:

IEnumerable<DataRow> query = 
            (from t in DataAccess.ds.GL40200.AsEnumerable()
            where t.SGMTNUMB == 3 
            select new { t.SGMNTID, t.DSCRIPTN });

DataTable myTable = query.CopyToDataTable<DataRow>();

dgv_Exhibitors.DataSource = myTable;

但是,这抱怨从 EnumerableRowCollection&lt;AnonymousType#1&gt;IEnumerable&lt;System.Data.DataRow&gt; 的隐式转换错误。

我尝试添加以下内容,但会导致运行时错误:

select new { t.SGMNTID, t.DSCRIPTN }).Cast<DataRow>();

虽然只选择“t”有效,但表格包含我不想向用户显示的列:

where t.SGMTNUMB == 3
select t;

您能否提供一种简单的方法来仅使用所需的两个列填充 DataGridView?如果有比使用 LINQ 更好或更简单的方法,我愿意接受建议。

【问题讨论】:

    标签: c# linq datagridview strongly-typed-dataset


    【解决方案1】:

    它失败了,因为您的 select 语句正在创建一个包含两个字段的匿名类。它不再是DataRow,编译器也不知道如何通过Cast&lt;T&gt;() 将其转换回DataRow


    一种选择是坚持使用有效的方法,然后在DataGridView 中隐藏您不想看到的列:

    dgv_Exhibitors.DataSource =
        DataAccess.ds.GL40200.AsEnumerable().Where(t => t.SGMTNUMB == 3).CopyToDataTable();
    
    foreach (var col in dgv_Exhibitors.Columns.Cast<DataGridViewColumn>()
                                      .Where(c => c.Name != "SGMNTID" && c.Name != "DSCRIPTN"))
    {
        col.Visible = false;
    }
    

    或者,设置AutoGenerateColumns = false,然后只定义您想要查看的列并将它们添加到DataGridView.Columns 集合中。


    另一种选择是使用您现有的方法,但在其上调用ToList(),并且不要费心尝试将其转换回DataTableDataGridView 可以显示任何集合:

    dgv_Exhibitors.DataSource = (from t in DataAccess.ds.GL40200.AsEnumerable()
                                 where t.SGMTNUMB == 3 
                                 select new { t.SGMNTID, t.DSCRIPTN }).ToList();
    

    【讨论】:

      【解决方案2】:

      扩展 Grant Winney 的答案,使用 var 而不是 IEnumerable &lt;DataRow&gt; 来接收匿名类型。

      var query = 
              (from t in DataAccess.ds.GL40200.AsEnumerable()
              where t.SGMTNUMB == 3 
              select new { t.SGMNTID, t.DSCRIPTN });
      

      如果您希望数据表中的结果,则必须创建一个并一一添加值。

      DataTable myTable = new DataTable();
      myTable.Columns.Add("SGMNTID", typeof(int));
      myTable.Columns.Add("DSCRIPTN", typeof(string));
      foreach (var x in query)
              {
                  DataRow dr = myTable.NewRow();
                  dr[0] = x.SGMNTID;
                  dr[1] = x.DSCRIPTN;
                  myTable.Rows.Add(dr);
              }
      
      dgv_Exhibitors.DataSource = myTable;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 2021-09-27
        • 1970-01-01
        相关资源
        最近更新 更多