Поиск элементов ListBox в VB.Net - PullRequest
1 голос
/ 29 ноября 2010

Я переносу приложение из VB6 в VB.Net, и я обнаружил изменение в поведении ListBox, и я не уверен, как сделать его равным VB6.

Проблема заключается в следующем:

В приложении VB6, когда ListBox сфокусирован и я в него набираю, список выбирает элемент, соответствующий тому, что я печатаю. например Если список содержит список стран, и я набираю «ита», в списке будет выбрано «Италия». Проблема в том, что в .Net версии элемента управления, если я наберу «ita», он выберет первый элемент, начинающийся с i, затем первый элемент, начинающийся с «t», и, наконец, первый элемент, начинающийся с «a» .

Итак, есть идеи о том, как получить оригинальное поведение? (Я думаю, что в какой-то собственности я не вижу по какой-то причине или что-то в этом роде)

Я действительно не хочу писать обработчик событий для этого (что, кстати, не будет тривиальным).

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 24 октября 2012

Я поделился разочарованием Уиллу.Это то, что я придумал.Добавьте класс 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 голос
/ 29 ноября 2010

Как вы, наверное, знаете, эта функция называется «впереди», и она не встроена в Winform ListBox (поэтому вы не пропускаете свойство).

Вы можете получить функцию опережающего ввода.в элементе управления ListView, если для его свойства View установлено значение List.

0 голосов
/ 07 мая 2011
    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
...