C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ComboBoxのDataSource


(過去ログ 125 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■74224 / inTopicNo.1)  ComboBoxのDataSource
  
□投稿者/ しろくま5 (4回)-(2014/12/09(Tue) 11:50:45)

分類:[VB.NET/VB2005 以降] 

こんにちは。
コンボボックスのDataSourceにDataTableを用いて、Display,ValueMember
それぞれを設定しようとしているのですが
DataTable.Selectを用いたフィルタを行った結果をDataSourceに代入するいい方法がわかりません。

よろしければSelectでの戻り値のDataRow()を使った方法があればお教えいただければと思います。

上記方法よりいい方法があればそちらでも構いません。よろしくお願いいたします。


試験的に試しているコードです。

        Dim names As String() = {"りんご", "バナナ", "レモン", "トマト", "ぶどう", "みかん", "柿", "めろん"}
        Dim colors As String() = {"赤", "黄", "黄", "赤", "紫", "橙", "橙", "緑"}
        Dim dt As New DataTable
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Color", GetType(String))
        Dim row As DataRow
        For lp As Integer = 0 To UBound(names)
            row = dt.NewRow
            row("Name") = names(lp)
            row("Color") = colors(lp)
            dt.Rows.Add(row)
        Next

        Dim result As DataRow() = dt.Select("Color = '黄'")

        ComboBox1.DataSource = ??

引用返信 編集キー/
■74226 / inTopicNo.2)  Re[1]: ComboBoxのDataSource
□投稿者/ Hongliang (258回)-(2014/12/09(Tue) 11:59:28)
CopyToDataTable拡張メソッドを使用すればDataRow()からDataTableを生成できますが、
http://msdn.microsoft.com/ja-jp/library/bb396189.aspx
DataTable::DefaultViewのRowFilterプロパティでフィルタリングするという手もあります。これならDataSourceに再代入する必要はありません。
引用返信 編集キー/
■74227 / inTopicNo.3)  Re[1]: ComboBoxのDataSource
□投稿者/ 魔界の仮面弁士 (192回)-(2014/12/09(Tue) 12:08:31)
No74224 (しろくま5 さん) に返信
> 試験的に試しているコードです。
VB のバージョンは何でしょうか?
少なくとも 2002/2003 では無さそうですが。



> Dim result As DataRow() = dt.Select("Color = '黄'")
> ComboBox1.DataSource = ??
VB2008 以降なら、こうかな。
 ComboBox1.DataSource = result.Select(Function(r) r.Field(Of String)("Name")).ToArray()

VB2005 以下での利用も想定される場合は、DataView を使った方が吉。
 ComboBox1.DisplayMember = "Name"
 ComboBox1.DataSource = New DataView(dt, "Color='黄'", "", DataViewRowState.CurrentRows)
引用返信 編集キー/
■74229 / inTopicNo.4)  Re[1]: ComboBoxのDataSource
□投稿者/ shu (641回)-(2014/12/09(Tue) 12:19:09)
No74224 (しろくま5 さん) に返信


以下のような感じで各要素をプロパティ付のクラス化して
ValueMember,DisplayMemberによる割り当てが出来るようにすればよいです。

        Dim result = (From r In dt.Select("Color = '黄'")
                      Select Disp = r("Name").ToString, value = r).ToList

        ComboBox1.ValueMember = "value"
        ComboBox1.DisplayMember = "Disp"
        ComboBox1.DataSource = result


    Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
        Dim row = TryCast(ComboBox1.SelectedValue, DataRow)
        If row Is Nothing Then Exit Sub
        Label1.Text = row("Name").ToString
        Label2.Text = row("Color").ToString
    End Sub

引用返信 編集キー/
■74230 / inTopicNo.5)  Re[2]: ComboBoxのDataSource
□投稿者/ 魔界の仮面弁士 (193回)-(2014/12/09(Tue) 12:20:00)
No74227 (魔界の仮面弁士 ) に追記
>>Dim result As DataRow() = dt.Select("Color = '黄'")
>>ComboBox1.DataSource = ??
> VB2008 以降なら、こうかな。
>  ComboBox1.DataSource = result.Select(Function(r) r.Field(Of String)("Name")).ToArray()

設問の「コンボボックスのDataSourceにDataTableを用いて、Display,ValueMember」を読み落としていました。
だとしたら、
 ComboBox1.ValueMember = "Name"
 ComboBox1.DataSource = result.CopyToDataTable()
ですかね。既に Hongliang さんが回答されていますけれども。


ところで、このテーブルのキー項目と表示項目は何でしょうか?

Color は重複があるので使えないでしょうから、DisplayMember と ValueMember の両方に
同じ項目名(Name)を指定されているということでしょうか。
引用返信 編集キー/
■74249 / inTopicNo.6)  Re[2]: ComboBoxのDataSource
□投稿者/ しろくま5 (5回)-(2014/12/10(Wed) 11:28:33)
皆様有難うございます。

昨日は所用でスレッド覗けず返信が遅れました。

HongliangさんのレスにありましたRowFilterを使って思い通りの表現ができました。

フィルタ部分に関しては

Dim dv As New DataView(dt)
dv.RowFilter = "Color = '黄'"

このような形でフィルタをかけました。

DataTableのメソッドにSelectがあったのでそれにとらわれすぎていたようです。


ご教授ありがとうございました。

併せて魔界の仮面弁士さん、shuさんもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -