2

ユーザーコントロールでホストしているwinformsリストボックスコントロールがいくつかあります。このユーザー コントロールで必要な動作は、リスト ボックスの 1 つだけに一度に選択した項目を持たせることです。

したがって、Listbox1 の項目を選択して listbox2 リストボックスの項目をクリックすると、すべての項目が自動的に選択解除されます。

私は次のコードでこれを達成しようとしました:

   dim listBox as listbox
   For Each listName As String In _listboxes.Keys
        If listName <> listboxName Then
            listbox = me.controls(listName)
            listbox.ClearSelected()
        End If
    Next

リストボックスの名前を辞書に保存しています。(リストボックスの数は動的です)。この例の listBoxName は、クリックされたばかりのリストボックスであるため、このコードはそのボックスの選択をクリアしないようにします。

このコードを実行したときの動作は非常に予想外です。listbox1、listbox2、listbox3 の 3 つのリストボックスがあるとします。listbox2 の item3 が現在選択されているとします。listbox1 の項目 4 をクリックすると、最終的に listbox1 の項目 4 が (予想どおり) 選択されますが、listbox2 では項目 1 が選択されます。

つまり、以前にアイテムを選択していた listBox では、選択がクリアされるのではなく、アイテム 1 が選択されたままになっています。

ClearSelection メソッド呼び出しの直後に debug.print listBox.SelectedItems.Count を発行しましたが、1 つの項目が選択されていることを確認しました。

これを行う方法やコードを修正する方法について何か考えはありますか?

セス

EDIT:ところで、私はリストボックスをビジネスオブジェクトコレクションにバインドしています。

4

1 に答える 1

2

2つのリストボックスを使用して簡単な例を実行し、このメソッドを機能させました。

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles ListBox1.Click, ListBox2.Click
    Dim lbx As ListBox = CType(sender, ListBox)
    Dim i As Integer = lbx.SelectedIndex
    ListBox1.ClearSelected()
    ListBox2.ClearSelected()

    lbx.SelectedIndex = i

End Sub

ClearSelectedメソッドを呼び出してすべてのリストボックスをループし、イベントをトリガーしたものを再選択するだけです。このコードを.SelectedIndexイベントで実行しないでください。無限ループに陥り、すぐにクラッシュが発生します。

于 2009-09-05T01:55:04.837 に答える