【问题标题】:Listbox event SelectedIndexChanged fires when index does not change当索引未更改时触发列表框事件 SelectedIndexChanged
【发布时间】:2013-01-21 20:30:05
【问题描述】:

我在一个 winforms 后面有这段代码,它只是有一个 listbox 作为它的唯一控件:

Imports System.Windows.Forms
Public Class Form1

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        ListBoxX.Items.Add("hello")
        ListBoxX.Items.Add("world")
        ListBoxX.Items.Add("foo")
        ListBoxX.Items.Add("bar")

    End Sub

    Private Sub ListBoxX_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBoxX.SelectedIndexChanged
        MessageBox.Show("change registered")
    End Sub

    Private Sub ListBoxX_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles ListBoxX.SelectedValueChanged
        MessageBox.Show("change registered X")
    End Sub
End Class

如果选择了“hello”,然后单击“hello”,则会出现消息框 - 当然,如果我单击同一项目,则 SelectedIndex 未更改 - 那么为什么会触发这个事件呢?如何确保它仅在索引更改时触发?

【问题讨论】:

    标签: .net vb.net winforms


    【解决方案1】:

    检查事件内部是否与之前选择的项目相同,

    每次点击时保存最后选择的项目。

    Private Sub ListBoxX_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBoxX.SelectedIndexChanged
        if Not LastItem = ListBoxX.SelectedItem Then
            MessageBox.Show("change registered")
            LastItem = ListBoxX.SelectedItem 
        end if
    End Sub
    

    很久没用VB写代码了,希望这段代码没问题。

    我假设无论选择哪个项目,该事件都会触发。

    另一种解决方案是覆盖 ListBox 用户控件,但我认为您不需要。

    【讨论】:

    • 所以创建一个字段LastItem 并每次都检查一下?
    • 创建一个字符串,可以创建一个整数来保存索引——这样更好。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多