为什么显示消息时要清空组合框的文本字段?



我在VB工作。. NET, Visual Studio 2017。我有一个组合框DropdownStyle =下拉。如果用户在组合框的文本字段中键入无效的内容(无效意味着它与组合框中的值不匹配),那么我们将显示一条消息,然后将焦点返回到文本字段并突出显示文本,这样他们就可以看到自己键入的内容。从验证事件中显示消息。

如果他们不打开下拉菜单,这工作得很好。如果他们确实打开了下拉菜单,并且在打开时输入了无效的条目,则会显示消息,但所输入的条目会被清除。我已经放入调试语句来查看正在触发的事件。在消息显示之前,我得到一个DropDownClosed(文本仍然在那里),然后是一个TextChanged(文本仍然在那里),然后是第二个TextChanged(文本现在为空)。我认为在显示信息时失去焦点可能会触发某些东西,但我不知道是什么。
我可以保存文本,然后在消息显示后替换它,但是当消息显示时,文本字段是空白的。什么好主意吗?

虽然我仍然不明白导致这个问题的一系列事件,但我找到了一个解决方案。就在从组合框的validation事件中显示消息之前,我将焦点设置为组合框。我猜,从无效的条目tab离开失去焦点,因为下拉菜单是打开的,然后关闭,以某种方式清除条目。图。

下面是验证事件的代码:

If testInList Then
ResultTextBox.Enabled = True
Else
TestComboBox.Focus
'If test is not in combobox, display message.
MyUtility.MicroUtilities.DisplayMessage(
My.Resources.RES_MSG_INVALID_TEST, MessageBoxIcon.Information, , , True)
e.Cancel = True
End If

"TestComboBox.Focus"Line已经修复了文本消失的问题。但是,如果用户的无效条目与下拉框中的项部分匹配,则组合框的文本字段中的文本将更新为该项,因此现在看起来他们键入了有效条目,但收到了无效的消息。例如,如果在"NAMC"下拉列表中有一个条目然后输入"NA"(随着下拉菜单的打开)并移开选项卡,条目变为"NAMC"。有什么办法可以预防吗?

注。AutocompleteMode设置为None

所以,再一次,我不明白事件的顺序,导致这个问题,但我已经找到了一些工作。如果我移动新的testcombobox。focus在If条件之外的行中,文本将保留在消息显示之前、期间和之后的文本字段中:

TestComboBox.Focus()
testInList = TestEntryValid()
If testInList Then
EnableResultFields(True)
Else
'If test is not in combobox, display message.
MyUtility.MicroUtilities.DisplayMessage(
My.Resources.RES_MSG_INVALID_TEST, MessageBoxIcon.Information, , , True)
e.Cancel = True
End If

这将。focus移动到TestEntryValid之前,但我没有看到任何会触发任何事件的内容:

Private Function TestEntryValid() As Boolean
Dim item As String = TestComboBox.Text
Dim validTest As Boolean = False
If item.Length > 0 Then
Dim index As Integer = TestComboBox.FindStringExact(item)
If index > -1 Then
validTest = True
End If
End If
Return validTest
End Function

如果有人能解释为什么这工作,我很想知道。如果没有,感谢所有回应的人!

最新更新