ListBox取消selectedValueChanged事件

时间:2014-01-05 22:23:11

标签: vb.net listbox

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

item = Me.ListBoxItem.SelectedValue
Me.itemID = index

我还有一个布尔dsIsEditing,如果dgv中的更改尚未提交给数据库,则设置为false。我想要做的是阻止用户在dsIsEditing = true时选择列表中的另一个项目。

我知道有一个带有cancelEventArgs参数的ListBox验证事件,但我无法弄清楚如何实现它。我最接近的是从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它将在ListBox中显示为选中,然后如果我选择不继续它将返回项目H.我在这里头痛:)找到正确的代码,以便如果从messageBox中选择No,则项目B不会在ListBox中显示为已选中。提前感谢您的回复。

1 个答案:

答案 0 :(得分:0)

在设计用户界面交互时,我发现这是一种更好的用户体验,可以防止用户做某事而不是告诉他们不行,然后尝试撤消他们所做的事情。

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

“取消编辑”按钮会询问用户上面提出的相同问题并执行必要的操作。

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

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

  1. 查找支持类似SelectedValueChanging事件的第三方控件,该事件允许您在更改值之前取消操作。

  2. 对ListBox控件进行子类化并尝试通过重写OnSelectedValueChanged方法自行实现此功能,尽管我并不是100%确信这将解决您的特定问题。这个Here is an example用于ComboBox; ListBox的实现应该几乎相同。