我正在使用Visual Studio 2005在VB.NET中开发。
我在Load方法中填充的表单上有一个ComboBox(myCombo)。
我还处理了myCombo.SelectedIndexChanged来更改表单上的标签。
编辑:我添加事件处理程序的方法是双击设计器上的组合框。然后在代码视图中出现了骨架代码。
看起来正在发生的事情是表单加载时,每次将项添加到myCombo时都会触发SelectedIndexChanged。
这不是我想要的,但我认为还有另一个事件处理程序,只有在用户更改选择时才会被调用。
以下是我所拥有的一些代码:
Private Sub myDlg_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' this is all I do with myCombo in this sub
list = GetListOfItemsToAdd()
myCombo.DataSource = list
myCombo.DisplayMember = "DisplayMember"
myCombo.ValueMember = "ValueMember"
End Sub
有人能指出我正确的方向吗?
一如既往地谢谢。
更新:我使用的解决方案是在事件生成器之后删除Handles子句,并在上面的“End Sub”之前添加它:
AddHandler myCombo.SelectedIndexChanged, AddressOf myCombo_SelectedIndexChanged
谢谢大家!
答案 0 :(得分:10)
SelectionChangeCommitted是用户更改ComboBox选择时调用的事件处理程序。
来自SelectionChangeCommitted的MSDN文档:
仅当用户更改组合框选择时才会引发SelectionChangeCommitted。不要使用SelectedIndexChanged或SelectedValueChanged来捕获用户更改,因为当选择以编程方式更改时也会引发这些事件。
但请注意,有一个错误意味着在某些情况下不会触发SelectionChangeCommitted事件(具体来说:使用键盘下拉列表,滚动到一个新项目,然后选项卡到另一个控件。选择是已更改,但未触发SelectionChangeCommitted事件)。见http://connect.microsoft.com/VisualStudio/feedback/details/115189/selectionchangecommitted-event-sometimes-not-raised-by-combobox
在实践中我发现用户并不认为这是一个问题 - 因此我继续使用SelectionChangeCommitted而不是使用SelectedIndexChanged的其他变通方法。但是当然是YMMV。
答案 1 :(得分:5)
您只能在加载数据后添加事件处理程序。 (使用AddHandler
关键字)
答案 2 :(得分:1)
您可以使用布尔值来确定您是否正在进行更改。当您开始更改项目时,请将其设置为true
。完成后,将其设置为false
。在事件处理程序中,您可以测试布尔值以确定用户是否是更改的发起者,如果不是则忽略该事件。