【问题标题】:Change selection in CheckedListBox as user types将 CheckedListBox 中的选择更改为用户类型
【发布时间】:2019-12-12 23:05:07
【问题描述】:

我们在 VB.NET 应用程序中有一个多选复选框的自定义实现。它在很大程度上工作得很好,但我们最近用这个控件替换了一个常规的单选 ComboBox,它不支持在键入时搜索。

例如,如果用户想要进入“zygote”,他们过去可以开始输入这个词,然后它会慢慢接近。现在,当您键入时,它会跳转到 z,然后是 y,然后是 g,依此类推。
是否有可能让它的行为与标准 ComboBox 一样?

目前,我捕获 KeyDown 和 KeyUp,因此它不会在键入时额外选择项目,但这不是理想的最终解决方案。

【问题讨论】:

  • “到达”是什么意思? “跳到”是什么意思?停止假设我们知道我们不知道的事情。提供完整和清晰的解释。向我们展示相关代码并提供相关截图。
  • @Jimi 成功了,谢谢。如果您想发布作为答案,我会接受。

标签: vb.net winforms checkedlistbox


【解决方案1】:

如 cmets 中所述,Timer 可以工作,但我会忽略它(因为旧且无聊:) 我将使用 Stopwatch 代替:

每次生成 KeyDown 事件时,秒表都会重新启动。
按下的键被添加到StringBuilder 对象(以避免创建大量字符串)。当按键之间的时间大于预定义值时,StringBuilder 容器被清除:在这里,我将其设置为400ms,以测试或添加配置选项。

► 双 StringBuilder.Append() 用于保留默认行为:当按键以 long 延迟按下时,它会迭代以相同字母开头的项目(或多或少是文件资源管理器做)。

KeyDown 处理程序被添加到表单的Sub New() 中,这里(添加到名为checkedList1 的 CheckedListBox)。它可用于处理 Form 中的任何 ListBox 或 CheckedListBox。

Imports System.Diagnostics
Imports System.Text

Sub New() 
    AddHandler checkedList1.KeyDown, AddressOf listBox_KeyDown
End Sub

Private swLb As New Stopwatch()
Private sbCLb As New StringBuilder()

Private Sub listBox_KeyDown(sender As Object, e As KeyEventArgs)
    Dim checkedList = DirectCast(sender, ListBox)
    If e.KeyCode < Keys.A Then Return
    If swLb.ElapsedMilliseconds > 400 Then
        sbCLb.Clear()
        sbCLb.Append(ChrW(e.KeyData))
        swLb.Restart()
        Return
    End If
    e.SuppressKeyPress = True
    sbCLb.Append(ChrW(e.KeyData))
    Dim idx = checkedList.FindString(sbCLb.ToString())
    checkedList.SelectedIndex = If(idx = ListBox.NoMatches, checkedList.SelectedIndex, idx)
    swLb.Restart()
End Sub

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多