我在用户控件中托管了几个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项。
简而言之,之前有一个项目选择的listBox仍然选择了第1项而不是清除选择。
我在ClearSelection方法调用之后立即发出了一个debug.print listBox.SelectedItems.Count,并且确定它已经选择了1个项目。
有关如何执行此操作或修复我的代码的任何想法?
赛斯
编辑:顺便说一下,我将列表框绑定到业务对象集合。
答案 0 :(得分: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事件中运行此代码,这将使您进入一个很快会导致崩溃的无限循环。