将LINQ查询绑定到DataGridView

10

这很令人困惑,我使用AsDataView将查询结果绑定到dgv,以下方式可以正常工作:

var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c;
dataGridView1.DataSource = query.AsDataView();

然而,这个会导致一个错误:

var query = from item in myDatabaseDataSet.Items
    where item.p_Id == p_Id
    join diamond in myDatabaseDataSet.Diamond
        on item.p_Id equals diamond.p_Id
    join category in myDatabaseDataSet.DiamondCategory
        on diamond.dc_Id equals category.dc_Id
    select new
    {
        Product = item.p_Name,
        Weight = diamond.d_Weight,
        Category = category.dc_Name
    };

    dataGridView1.DataSource = query.AsDataView();

错误:

Instance argument: cannot convert from
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 
'System.Data.DataTable'

为什么AsDataView在查询(List)中没有显示出来?如何将上述查询绑定到dgv?


请查看此链接:LINQ to DataTable 也许您可以在这里找到答案:使用DataSet中的LINQ时出现类型转换错误 - Leniel Maccaferri
2个回答

4

AsDataView的签名如下:

public static DataView AsDataView(
    this DataTable table
)

唯一的参数是 DataTable
你查询的结果返回了一个匿名类型的 IEnumerable ,它没有隐式转换成 DataTable(或一系列的 DataRow 实例,在这种情况下,您可以使用它来帮助创建 DataTable)。
你需要将结果放回到一个 DataTable 或者你可以转换成 DataTable 的东西中,然后它就能正常工作了。
在你的特定情况中,似乎你使用了 Typed DataSet。如果是这样的话,那么你应该能够获取选定的值,然后创建新的 Typed DataRow 实例(应该有工厂方法),然后将其放入 Typed DataTable 中,然后可以调用 AsDataView。

谢谢,但我正在寻找一种简单的方法,有些现成的方法不起作用。所以我想我会使用SqlCeDataReader来完成它。 - DanSogaard
@DanSogaard:我已经更新了我的答案,以反映您正在使用类型化数据集以及如何仍然能够使用AsDataView扩展方法。 - casperOne

2
只需将结果简单地转换为列表并绑定到您的表格即可。
var query = from item in myDatabaseDataSet.Items
    where item.p_Id == p_Id
    join diamond in myDatabaseDataSet.Diamond
        on item.p_Id equals diamond.p_Id
    join category in myDatabaseDataSet.DiamondCategory
        on diamond.dc_Id equals category.dc_Id
    select new
    {
        Product = item.p_Name,
        Weight = diamond.d_Weight,
        Category = category.dc_Name
    }.ToList();
dataGridView1.DataSource = query;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接