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 がクエリに表示されません (リスト)。なぜこれが起こるのですか?上記のクエリを dgv にバインドする方法は?

4

2 に答える 2

4

AsDataViewのシグネチャは次のとおりです。

public static DataView AsDataView(
    this DataTable table
)

唯一のパラメータはDataTableです。

あなたが持っているクエリは、DataTableへの暗黙的な変換を持たない匿名型のIEnumerableを返しています(またはDataRowインスタンスのシーケンス。この場合、それを使用してDataTableを作成できます)。

結果を DataTable または DataTable に変換できるものに戻す必要があり、それが機能します。

あなたの特定のケースでは、型付き DataSetsを使用していた (または使用している) ようです。その場合は、選択された値を取得して、新しい型指定された DataRow インスタンスを作成し (ファクトリ メソッドがあるはずです)、型指定された DataTable に配置して、AsDataView を呼び出すことができるはずです。 .

于 2010-03-06T17:16:21.250 に答える
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;
于 2012-09-12T07:10:28.030 に答える