我有一个问题似乎无法找到答案。好的,我在表单上有一个数据集,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中显示为已选中。提前感谢您的回复。
答案 0 :(得分:0)
在设计用户界面交互时,我发现这是一种更好的用户体验,可以防止用户做某事而不是告诉他们不行,然后尝试撤消他们所做的事情。
在您的情况下,我要做的是一旦dsIsEditing标志设置为true,禁用ListBox然后启用取消(或撤消)编辑按钮。
“取消编辑”按钮会询问用户上面提出的相同问题并执行必要的操作。
成功保存更改后,重新启用列表框并禁用“取消编辑”按钮。
如果由于某种原因这不起作用,你可以:
查找支持类似SelectedValueChanging事件的第三方控件,该事件允许您在更改值之前取消操作。
对ListBox控件进行子类化并尝试通过重写OnSelectedValueChanged方法自行实现此功能,尽管我并不是100%确信这将解决您的特定问题。这个Here is an example用于ComboBox; ListBox的实现应该几乎相同。