2

我在用户控件中托管了几个 winforms 列表框控件。我想要在这个用户控件中的行为是我只希望一个列表框一次有一个选定的项目。

因此,如果我选择了 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 是刚刚单击的列表框,因此此代码避免清除该框中的选择。

运行此代码时得到的行为非常出乎意料。假设我有 3 个列表框...listbox1、listbox2 和 listbox3。假设当前选中了 listbox2 中的 item3。如果我单击 listbox1 的第 4 项,则最终结果是选择了 listbox1 中的第 4 项(如预期的那样),但 listbox2 选择了第 1 项。

简而言之,之前有一个项目选择的列表框仍然选择了项目 1,而不是被清除选择。

我在 ClearSelection 方法调用后立即发出了 debug.print listBox.SelectedItems.Count ,果然它说选择了 1 个项目。

关于如何执行此操作或修复我的代码的任何想法?

赛斯

编辑:顺便说一句,我将列表框绑定到业务对象集合。

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 回答