我正在将应用程序从VB6迁移到VB.Net,我发现ListBox的行为发生了变化,我不确定如何使它等于VB6。
问题在于:
在VB6应用程序中,当ListBox聚焦并输入时,列表会选择与我输入的内容相匹配的元素。例如如果列表包含国家/地区列表并输入“ita”,则会在列表框中选择“意大利”。 问题是,如果输入“ita”,那么使用.Net版本的控件,它将选择以i开头的第一个元素,然后是以“t”开头的第一个元素,最后是以“a”开头的第一个元素
那么,关于如何获得原始行为的任何想法? (我在考虑某些属性,我没有因某种原因或类似的东西而看到)
我真的不想为此编写一个事件处理程序(顺便说一句,这不会是微不足道的。)
非常感谢!
答案 0 :(得分:4)
我分享了Willw的挫败感。这就是我提出的。将一个名为ListBoxTypeAhead的类添加到项目中并包含此代码。然后使用此类作为表单上的控件。它捕获键盘输入并以旧VB6列表框的方式移动所选项目。如果您愿意,可以取出计时器。它模仿Windows资源管理器中键盘输入的行为。
Public Class ListBoxTypeAhead
Inherits ListBox
Dim Buffer As String
Dim WithEvents Timer1 As New Timer
Private Sub ListBoxTypeAhead_KeyDown(sender As Object, _
e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.A To Keys.Z, Keys.NumPad0 To Keys.NumPad9
e.SuppressKeyPress = True
Buffer &= Chr(e.KeyValue)
Me.SelectedIndex = Me.FindString(Buffer)
Timer1.Start()
Case Else
Timer1.Stop()
Buffer = ""
End Select
End Sub
Private Sub ListBoxTypeAhead_LostFocus(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.LostFocus
Timer1.Stop()
Buffer = ""
End Sub
Public Sub New()
Timer1.Interval = 2000
End Sub
Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
Timer1.Stop()
Buffer = ""
End Sub
End Class
答案 1 :(得分:1)
正如您可能知道的那样,此功能称为“预先输入”,并且它未内置到Winform ListBox中(因此您不会错过任何属性)。
如果将View
属性设置为List
,则可以在ListView控件上获得预先输入功能。
答案 2 :(得分:-1)
Public Function CheckIfExistInCombo(ByVal objCombo As Object, ByVal TextToFind As String) As Boolean
Dim NumOfItems As Object 'The Number Of Items In ComboBox
Dim IndexNum As Integer 'Index
NumOfItems = objCombo.ListCount
For IndexNum = 0 To NumOfItems - 1
If objCombo.List(IndexNum) = TextToFind Then
CheckIfExistInCombo = True
Exit Function
End If
Next IndexNum
CheckIfExistInCombo = False
End Function