Vb.net 列表框取消selectedValueChanged事件

Vb.net 列表框取消selectedValueChanged事件,vb.net,listbox,Vb.net,Listbox,我有个问题,我似乎找不到答案。好的,我在表单上有一个数据集、dgv和一个列表框。数据集有几个表,对于某些表,通过listbox selectedValueChanged事件选择并设置主键。用户单击列表框中的名称,然后将item selectedValue分配给item变量 item = Me.ListBoxItem.SelectedValue Me.itemID = index 我还有一个布尔值dsIsEditing,如果dgv中的更改尚未提交到数据库,它将设置为false。如果dsIsEdi

我有个问题,我似乎找不到答案。好的,我在表单上有一个数据集、dgv和一个列表框。数据集有几个表,对于某些表,通过listbox selectedValueChanged事件选择并设置主键。用户单击列表框中的名称,然后将item selectedValue分配给item变量

item = Me.ListBoxItem.SelectedValue
Me.itemID = index
我还有一个布尔值dsIsEditing,如果dgv中的更改尚未提交到数据库,它将设置为false。如果dsIsEditing=true,我要做的是阻止用户在列表中选择另一项

我知道有一个ListBox验证事件带有cancelEventArgs参数,但我不知道如何实现它。我得到的最接近的结果是从ListBoxItem selectedValueChanged事件中实现以下代码:

    If dsIsEditing = True Then
        Dim result As MsgBoxResult
        Dim clearMsg As String
        clearMsg = "You have unsave changes. Are you sure you " & _
                   "want to proceede? Any unsave changes will be lost."

        result = MessageBox.Show(clearMsg, "Switching Order Selection", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2)
        If result = MsgBoxResult.No Then
            RemoveHandler ListBoxItem.SelectedValueChanged, AddressOfListBoxItem_SelectedValueChanged
            Me.ListBoxItem.SelectedValue = Me.itemID
            AddHandler ListBoxItem.SelectedValueChanged, AddressOf ListBoxItem_SelectedValueChanged
            Exit Sub
        End If
    End If

代码按照我的要求执行,但假设当前项目是项目H,如果单击项目B,它将在列表框中显示为选中,然后,如果我选择不继续,它将返回到项目H。我在这里最头疼的是:)找到正确的代码,这样,如果从messageBox中选择“否”,则项目B就不会在列表框中显示为所选。提前感谢您的回复

在设计用户界面交互时,我发现阻止用户做某件事,而不是告诉他们这件事不正常,然后试图撤销他们所做的事情,是一种更好的用户体验

在您的情况下,我要做的是,一旦dsIsEditing标志设置为true,禁用列表框,然后启用取消(或撤消)编辑按钮

“取消编辑”按钮将向用户询问与上述问题相同的问题,并执行任何必要的操作

成功保存更改后,重新启用列表框并禁用“取消编辑”按钮

如果出于某种原因,这不起作用,您可以:

  • 寻找支持SelectedValueChanged事件之类的第三方控件,该事件允许您在更改值之前取消操作

  • 对ListBox控件进行子类化,并尝试通过重写OnSelectedValueChanged方法来实现此功能,尽管我并不100%相信这会解决您的特定问题。对于ComboBox,这一点正在发挥作用;ListBox的实现应该几乎相同


  • 谢谢你的回复。根据你的建议,我想我是在正确的轨道上禁用ListBox控件的。我还有一个DateTimePicker控件,一旦dsIsEditing=True,我就将其设置为禁用。我本应该对列表框也这么做的。还感谢您提供代码示例的链接。当心。