複数列設定したコンボボックスで

タグの編集
投稿者 えふ  (社会人) 投稿日時 2009/9/17 18:57:16
はじめまして。中学校を利用させていただきVB2008の勉強をしております。
Vb2008にてCombobox1にキーと値を設定しています。
テキストボックスにキー値を入力しButton1をクリックすることで
Combobox1の表示がテキストボックスのキーに相当した値になるように
するにはどうすればよいのでしょうか?教えて下さい。

[Form Load にて]
        ComboBox1.Items.Clear()
        ComboBox1.Items.Add(New DictionaryEntry("001", "日本"))
        ComboBox1.Items.Add(New DictionaryEntry("002", "アメリカ"))
        ComboBox1.Items.Add(New DictionaryEntry("003", "中国"))
        ComboBox1.Items.Add(New DictionaryEntry("004", "インド"))

[Button1_Clickクリック]
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   
  この部分がわかりません。   
 
    End Sub

技術的なことで申し訳ありませんがよろしくお願いします。
投稿者 えふ  (社会人) 投稿日時 2009/9/17 19:30:48
すいません。補足です。
form load にて comboboxに下記を設定しています。
        ComboBox1.DisplayMember = "Value"
       ComboBox1.ValueMember = "key"
よろしくお願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/9/17 20:57:02
.Items.Add ではなく、.DataSource で指定するのは駄目でしょうか?

Private Sub Form1_Load(ByVal sender As ObjectByVal e As EventArgs) Handles MyBase.Load
    ComboBox1.DisplayMember = "Value"
    ComboBox1.ValueMember = "Key"
    Dim list As New Dictionary(Of StringString)()
    list.Add("001""日本")
    list.Add("002""アメリカ")
    list.Add("003""中国")
    list.Add("004""インド")
    ComboBox1.DataSource = list.ToList()
End Sub

Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
    ComboBox1.SelectedValue = TextBox1.Text
End Sub


もし、DataSource を使わないのだとすると、恐らくは SelectedValue 経由での「設定」が
使えなくなるので、SelectedIndex で処理することになるかと思います。

Private Sub Form1_Load(ByVal sender As ObjectByVal e As EventArgs) Handles MyBase.Load
    ComboBox1.DisplayMember = "Value"
    ComboBox1.ValueMember = "Key"
    ComboBox1.Items.Clear()
    ComboBox1.Items.Add(New DictionaryEntry("001""日本"))
    ComboBox1.Items.Add(New DictionaryEntry("002""アメリカ"))
    ComboBox1.Items.Add(New DictionaryEntry("003""中国"))
    ComboBox1.Items.Add(New DictionaryEntry("004""インド"))
End Sub

Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
    'ループで探す 
    Dim selectedIndex = -1
    For Index = 0 To ComboBox1.Items.Count - 1
        Dim entry = ComboBox1.Items(Index)
        If TypeOf entry Is DictionaryEntry Then
            If DirectCast(entry, DictionaryEntry).Key = TextBox1.Text Then
                selectedIndex = Index
                Exit For
            End If
        End If
    Next
    ComboBox1.SelectedIndex = selectedIndex
End Sub

Private Sub Button2_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button2.Click
    'Linq で探す 
    ComboBox1.SelectedIndex = ComboBox1.Items.OfType(Of Object).Select( _
            Function(Entry, Index) New With {Entry, Index}).Where( _
            Function(x) ((TypeOf x.Entry Is DictionaryEntry) AndAlso ( _
            DirectCast(x.Entry, DictionaryEntry).Key = TextBox1.Text))).Select( _
            Function(n) n.Index).DefaultIfEmpty(-1).First()
End Sub
投稿者 えふ  (社会人) 投稿日時 2009/9/17 22:07:41
魔界の仮面弁士さんありがとうございます。

すごいですよね。尊敬します。
ループだとコンボの内容が増えると処理時間もその分かかりますしButton1_Clickの
方法ではうまくいきませんでした。Button2_Clickだとうまくいきましたので
参考にさせていただきます。
また他の件で問合せするかもしれませんがよろしくお願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/9/17 23:57:38
> ループだとコンボの内容が増えると処理時間もその分かかりますし
処理時間が増加するのは、Linq であっても一緒なのでは無いでしょうか。

また、件数が多いのであればなおのこと、DataSource 指定の方が都合が良いと思いますよ。
(その場合には、データを DataTable で管理した方が便利です)


> Button1_Clickの方法ではうまくいきませんでした。
あれ。当方では問題が無いのですが…何故でしょうね。
投稿者 えふ  (社会人) 投稿日時 2009/9/19 00:48:35
魔界の仮面弁士さん、遅くなりましたが私のコーディングミスでした。
すいません。
また別途で掲示板に知りたいことありますんでそのときはよろしくお願いします。