想要文本框中的向上和向下箭头来更改列表框选择

Posted

技术标签:

【中文标题】想要文本框中的向上和向下箭头来更改列表框选择【英文标题】:Want up and down arrow in TextBox to change ListBox selection 【发布时间】:2020-07-23 18:15:28 【问题描述】:

在 macOS Mojave 上使用 Microsoft Excel 2011,我有一个带有文本框(名为 NameEntry)、一个列表框(名为 NameList)和两个命令按钮的用户窗体。当 TextBox 有焦点时,我希望上下箭头键的作用就像 ListBox 有焦点一样,即选择 ListBox 中的下一个或上一个项目,同时将焦点留在 TextBox 上(作为奖励,换行顶部和底部,如果还按下了 shift 则一直向上或向下移动)。这是我的代码:

Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   Dim i As Long

   If KeyCode = vbKeyUp Or KeyCode = vbKeyDown Then
      i = NameList.ListIndex

      Select Case KeyCode
         Case vbKeyUp
            If Shift And 1 Then
               i = 0
            Else
               i = i - 1
                
               If i < 0 Then
                  i = NameList.ListCount - 1
               End If
            End If

         Case vbKeyDown
            If Shift And 1 Then
               i = NameList.ListCount - 1
            Else
               i = i + 1

               If i >= NameList.ListCount Then
                  i = 0
               End If
            End If
      End Select

      NameList.ListIndex = i
   End If
End Sub

这非常适合向上箭头。选择向上移动一行,从顶部环绕到底部,向上移动箭头选择第一个项目。 TextBox 保持焦点。向下移动箭头也可以完美地工作,选择最后一项。向下箭头有点的作品。下一项被选中,如果最后一项被选中,则第一项被选中,但焦点始终转移到 ListBox。我已经尝试在NameEntry_KeyDown 子的末尾添加NameEntry.SetFocus,我添加了 KeyPress 和 KeyUp 子,并在它们被调用时进行了观察,到目前为止我感到困惑。上移、上移和下移使 TextBox 保持焦点,向下聚焦于 ListBox。如何获得向下箭头以将焦点留在 TextBox 上?

(我可能有一个全局的DoingArrowStuff 变量,如果设置了它,则取消从TextBox 退出,但如果由于某种原因没有调用NameEntry_Exit,该变量将保持设置并防止稍后退出。这似乎是一个脆弱的解决方案。)

【问题讨论】:

【参考方案1】:

我稍微调整了您的代码以使其更简洁,但主要添加的是 KeyCode = 0 行:

Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   Select Case KeyCode
      Case vbKeyUp
         KeyCode = 0
         
         If Shift = 1 Then
            NameList.ListIndex = 0
         Else
            If NameList.ListIndex > 0 Then
               NameList.ListIndex = NameList.ListIndex - 1
            Else
               NameList.ListIndex = NameList.ListCount - 1
            End If
         End If
      Case vbKeyDown
         KeyCode = 0
         
         If Shift = 1 Then
            NameList.ListIndex = NameList.ListCount - 1
         Else
            If NameList.ListIndex < NameList.ListCount - 1 Then
               NameList.ListIndex = NameList.ListIndex + 1
            Else
               NameList.ListIndex = 0
            End If
         End If
   End Select
End Sub

KeyCode = 0 的作用是忽略按键并执行您的逻辑。

【讨论】:

是的,我是 VBA 新手,所以仍在研究如何格式化代码等问题,感谢您的建议。只是测试 Shift = 1 会稍微改变语义,因为 ctrl-shift-arrow 现在无法在我的代码中与 shift-arrow 相同的地方工作。最后, KeyCode = 0 使它完美运行!但我很困惑为什么。它是按值传递的,所以看起来对它的任何更改都应该是 Sub 本地的,但显然不是这样。无论如何,这只是我的好奇心,它解决了问题,所以谢谢。 确实值得提出一个新问题@blm :-)

以上是关于想要文本框中的向上和向下箭头来更改列表框选择的主要内容,如果未能解决你的问题,请参考以下文章

在组合框中使用向下/向上箭头键选择数据而不更新数据,直到点击选项卡或输入 MS Access

将输入文本框中的文本替换为所选自动完成选项中的文本

防止“向上箭头”键在文本框中重置光标位置

向上和向下键未触发 datagridview 单元格中的按键事件文本框

如何更改 Select2 框中文本的填充

使用向上和向下的文本框键在 datagridview 中移动