none
DataTableをLINQしてDataGridViewのDataSourceに設定 RRS feed

  • 質問

  • お世話になります。

    DataTableのデータを、LINQを使って条件を絞り、DataGridViewのDataSouceにバインドしたいのですが、うまくいきません。

    ----

    Dim dt As New DataTable
           

    dt.Columns.Add("ID")
    dt.Columns.Add("Name")

    dt.Rows.Add("1", "AAA")
    dt.Rows.Add("2", "BBB")
    dt.Rows.Add("3", "CCC")
    dt.Rows.Add("4", "DDD")
    dt.Rows.Add("5", "FFF")

    Dim filterDt = From row In dt.Rows Where row("ID") >= 4

    MessageBox.Show(filterDt.Count)
    DataGridView1.DataSource = filterDt

    ---

    MessageBoxの箇所では、きちんと「2」が返るのですが、DataGridView1へのバインド

    (ここではDDDとFFFの行ができるはず)がうまくいきません。

    ご教示いただけたらうれしいです。

    よろしくお願いします。

    2012年5月31日 7:58

回答

  • AsEnumerableが出てこないとのことですが、参照設定にSystem.Data.DataSetExtensions があるか確認してみて下さい。
    コードとしては、

    Dim filterDt = From row As DataRow In dt.Rows Where row("ID") >= 4
    として、rowの型を明示するか、
    Dim filterDt = From row In dt.AsEnumerable Where row("ID") >= 4

    とした上で、

    DataGridView1.DataSource = filterDt.CopyToDataTable

    で動作するはずです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年5月31日 8:45
    モデレータ

すべての返信

  • 「うまくいきません」ではなく、具体的にどうなってしまうのか記述しましょう。

    エラーがでるのならどんなエラーが出るか記述します。意図しない結果が出るのであればその内容を記述します。

    2012年5月31日 8:11
  • エラーはでません。DataGridView1に何も表示されません。意図しない結果が「うまくいきません」です。

    修正します。

    エラーはでません。

    意図しない結果は「DataGridView1に何も表示されません。

    2012年5月31日 8:13
  • 「うまくいかない」の内容を聞いているのですから、意図しない結果は「DataGridView1に何も表示されません。」でしょう。

    これでいかが?
    dataGridView1.DataSource = new DataView(dt, "ID >= '4'", nothing, DataViewRowState.Added)

    2012年5月31日 8:36
  • 補足します。

    いろんなサイト(どのサイトかは割愛)を拝見するに、「AsEnumerable」なるものがでてくるのですが、

    Dim filterDt = From row In dt.Rows Where row("ID") >= 4

    のdtにAsEnumerableがインテリセンスにでてこないです。

    (「AsEnumerableはSystem.Data.DataTableのメンバではないです」)

    2012年5月31日 8:36
  • AsEnumerableが出てこないとのことですが、参照設定にSystem.Data.DataSetExtensions があるか確認してみて下さい。
    コードとしては、

    Dim filterDt = From row As DataRow In dt.Rows Where row("ID") >= 4
    として、rowの型を明示するか、
    Dim filterDt = From row In dt.AsEnumerable Where row("ID") >= 4

    とした上で、

    DataGridView1.DataSource = filterDt.CopyToDataTable

    で動作するはずです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年5月31日 8:45
    モデレータ
  • ありがとうございます。
    2012年5月31日 8:59
  • できました!ありがとうございます!

    2012年5月31日 8:59