【问题标题】:Why is text clearing from the text field of a combobox if message is displayed?如果显示消息,为什么从组合框的文本字段中清除文本?
【发布时间】:2021-02-26 22:36:15
【问题描述】:

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

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

【问题讨论】:

  • 我们不应该要求您发布相关代码。如果看不到您的代码,我们就无法测试您的代码。
  • 您能否至少向我们展示一下验证事件。猜猜你在哪里取消它,这意味着数据不再有效,因此被清除
  • 我将在下面发布代码。因为虽然我已经部分解决了这个问题,但仍然存在问题。

标签: vb.net combobox


【解决方案1】:

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

这是验证事件的代码:

            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”行修复了文本消失的问题。但是,如果用户的无效条目与下拉列表中的某个项目部分匹配,则组合框文本字段中的文本将更新为该项目,因此现在看起来他们键入了一个有效条目但收到一条消息这是无效的。例如,如果“NAMC”下拉列表中有一个条目,并且他们键入“NA”(下拉列表打开)并离开,则该条目将更改为“NAMC”。 关于如何防止这种情况的任何想法?

附言AutocompleteMode 设置为 None。

【讨论】:

  • 在您的验证事件中执行 e.Cancel = True 是清除它的原因。这表示输入无效,因此为用户清除
  • 当我单步执行代码时,文本会在我到达 e.Cancel 之前清除。当我执行显示消息的行时它会清除。
  • 为了验证不是导致问题的特定消息代码,我将其替换为一个简单的 MsgBox。结果相同。
【解决方案2】:

再说一次,我不明白导致问题的事件顺序,但我发现了一些可行的方法。如果我将新的“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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多