【问题标题】:Disable dynamic searching when typing in a listbox在列表框中键入时禁用动态搜索
【发布时间】:2010-05-10 23:08:22
【问题描述】:

在 VB6 中,如果包含字母数字数据的列表框具有焦点并且按下了字符键,则列表框中以该字符开头的第一个元素将被突出显示。如果按下多个字符,则在每次按下字符后选择以每个字符开头的第一个元素。键入 M-A-R-T 将选择第一个 M-word,然后是第一个 A-word,依此类推。

我想做的是编写一个算法,使用多个字符串动态搜索列表框。因此,键入 M-A-R-T 将突出显示以 M-A-R-T 开头的第一个元素。 “Sorted”属性已经做到了这一点,但我的列表框在一个使用自定义排序方法的包装器中,如果打开了 Sorted,该方法就会损坏。

我已经编写了所有代码来搜索列表框,并且它可以正常工作,只是默认的搜索行为仍在发生。当我按 M 时,第一个 M 字被突出显示。然后我按A,第一个A字被高亮显示。当我释放 A 时,第一个 M-A 单词被突出显示。然后我按 R,第一个 R 字被突出显示。然后我释放 R 并且第一个 M-A-R 单词被突出显示。所以行为是我想要的,除了在 Keydown 和 Keyup 事件之间的某处进行了额外的搜索。

有没有办法禁用或屏蔽默认的列表框搜索行为?还是锁定滚动条使系统无法滚动?

【问题讨论】:

    标签: vb6 listbox


    【解决方案1】:

    尝试添加这个:

    Private Sub List1_KeyPress(KeyAscii As Integer)
        KeyAscii = 0
    End Sub
    

    【讨论】:

      【解决方案2】:

      自动滚动发生在 KeyDown 事件之后的某个时间。如果表单元素被禁用,它不会注册任何键事件。所以我在自己的过滤器之后添加了这 3 行:

          mobjListBox.Enabled = False
          mobjListBox.Enabled = True
          mobjListBox.SetFocus
      

      我猜当第一次按下一个键时,VB6 会提前计算出它要调用的所有键事件。如果控件被禁用,VB 会重构要调用的关键事件列表。因此,通过禁用控件,我强制 VB 从工作流中删除其他关键事件(如滚动)。然后我再次启用该控件并将焦点返回给它。

      多多!

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多