none
WPF にはDataTable.Select() RRS feed

  • 質問

  • 私はDataSetからデータを取って、GridViewにデータを表示させたいです。下記のコードを作成しました。
    <ListView Grid.Row="1" Name="listView_receptyNumerRecepty" Margin="10,50,10,10">
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=RecipeNumber}">
                            <GridViewColumnHeader Content="Numer recepty" />
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
            <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox_receptyNumerRecepty" VerticalAlignment="Top" Width="120" />

    string expression = "RecipeNumber LIKE '" + textBox_receptyNumerRecepty.Text + "%'";
    listView_receptyNumerRecepty.ItemsSource = recepty.GetRecipes().Tables[0].Select(expression);


    expressionによって、選択結果が変化することを要望しますが、何も表示されていません。どうやってそれを直せますか。
    2010年2月24日 8:27

回答

  • 普通に ReceipeNumber 列を全行表示させるところまではできていると考えてよろしいでしょうか?

    DataTable.Select メソッド (String) (System.Data)
    をまずご確認下さい。
    // 上記リンク ja-jp のページですが、ネイティブの言語の方が見やすければ URL の ja-jp を適切なロケールに変更して下さい。
    返値が DataRow[] であることから推測もできますが、このメソッドは DataTable 自身を変更しません。あくまで、expression にマッチした行の配列を返すだけです。
    ですからこのメソッドを呼び出しただけでは表示上のものには何の関係もないのです。

    DataTable を使ってバインディングする場合、 ItemsSource に直接 DataTable を割り当てていると思います。
    実は実際に表示のために使用されるデータは、この DataTable そのものではなく、それを表示するための DataView オブジェクトになります。DataView は明示的に作成することもできますが、直接バインディングソースに DataTable を指定した場合、その DataTable の DefaultView で取得できる既定の DataView オブジェクトが使用されます。
    DataView クラスには RowFilter プロパティが存在しており、DataTable.Select などと同じ構文を使ってフィルタリングを行うことができます。
    DataView.RowFilter プロパティ (System.Data)

    まとめると、行フィルタは recepty.GetRecipes().Tables[0].DefaultView.RowFilter を設定すればいいと言うことです。
    • 回答としてマーク YoShiKa 2010年2月25日 2:10
    2010年2月24日 9:32