Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Поиск по ListBox Добавлено: 06.12.10 01:39  

Автор вопроса:  SlayerNik
Помогите пожалуйста сделать поиск по ListBox
допустим в textbox пишу слово, нажимаю кнопку, и нужно чтобы выделялась та строчка листбокса где есть такое слово, либо если такого нет чтобы выскакивало "нечего не найдено"

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 06.12.10 08:52
Так, и в чем проблема?
Что ты уже сделал чтоб ее решить? На чем споткнулся?

Ответить

Номер ответа: 2
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #2 Добавлено: 29.12.10 12:42
например так:
  1.  
  2.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  3.         TextBox1.Text = ""
  4.         With ListBox1.Items
  5.             .Add("МП-Ком правда")
  6.             .Add("Tanya")
  7.             .Add("Shannon")
  8.             .Add("Московская правда")
  9.             .Add("Московский комсомолец")
  10.             .Add("Московские новости")
  11.             .Add("Johnny")
  12.             .Add("Mike")
  13.             .Add("Derek")
  14.             .Add("Scotty")
  15.             .Add("МП-Сов Рос")
  16.             .Add("Scott")
  17.             .Add("Tyna")
  18.             .Add("Diana")
  19.             .Add("Chris")
  20.             .Add("Stanley")
  21.             .Add("Kamal")
  22.             .Add("МП-Куряд")
  23.             .Add("Молоко")
  24.             .Add("Кефир")
  25.             .Add("Каша")
  26.             .Add("Сливки")
  27.             .Add("Слава")
  28.             .Add("Камаз")
  29.             .Add("Молозиво")
  30.             .Add("Сигареты")
  31.             .Add("Марка")
  32.             .Add("Магнолия")
  33.             .Add("Мурка")
  34.             .Add("Стрела")
  35.         End With
  36.     End Sub
  37.  
  38.     Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
  39.         Dim countSymbol As Integer = Len(TextBox1.Text) 'количество символов в строке
  40.         Dim intSearchResult As Integer 'количество найденных совпадений
  41.         Dim strFind As String = UCase(TextBox1.Text) 'строка, которую ищем
  42.  
  43.         ListBox2.Items.Clear()
  44.  
  45.         For i = 0 To ListBox1.Items.Count - 1
  46.             intSearchResult = InStr(UCase(Mid(ListBox1.Items(i), 1, countSymbol)), strFind)
  47.             If intSearchResult > 0 Then ListBox2.Items.Add(ListBox1.Items(i))
  48.         Next i
  49.  
  50.         If ListBox2.Items.Count = 0 And Not (countSymbol = 0) Then MessageBox.Show("Искомая строка: " & strFind & " не найдена", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
  51.  
  52.     End Sub

Ответить

Номер ответа: 3
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #3 Добавлено: 29.12.10 13:13
Какой ужас ..

Ответить

Номер ответа: 4
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #4 Добавлено: 29.12.10 14:09
почему ужас?
я новичек... а код работает исправно.
может так будет Не Ужас?
  1.  
  2.  Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
  3.         Dim searchString As String = Trim(LCase(TextBox2.Text)) 'получить строку для поиска
  4.         Dim countchar As Integer = Len(searchString) 'количество символов для сравнения
  5.         ListBox2.Items.Clear()
  6.         If countchar = 0 Then
  7.             Exit Sub
  8.         Else
  9.             For I = 0 To ListBox1.Items.Count - 1
  10.                 Dim StringName As String = Trim(LCase(Mid(ListBox1.Items(I), 1, countchar))) ' в этой строке ищем
  11.                 Dim mChar As Boolean = String.Equals(StringName, searchString) ' результат сравнения строк
  12.  
  13.                 If mChar = True Then
  14.                     ListBox2.Items.Add(ListBox1.Items(I))
  15.                 End If
  16.             Next
  17.         End If
  18.     End Sub
  19.  
  20. Если опять УЖАС... Предложите, как правильно?

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 29.12.10 14:53
может так будет Не Ужас?

снова ужас.. :)

Дружище, в NET не принято юзать ф-ции усаревшего языка.. я говорю о Trim,LCase,Mid и т.д.. Кроме того ты используешь тупой перебор, а это есть некорректно..
Если бы удосужился взглянуть на документацию ты бы обнаружил там как минимум 2 метода с 2 перегрузками каждый которые предназначены для поиска строки в ListBox

public int FindString(string s)
    Member of System.Windows.Forms.ListBox
Summary:
Finds the first item in the System.Windows.Forms.ListBox that starts with the specified string.
Parameters:
s: The text to search for.
Return Values:
The zero-based index of the first item found; returns ListBox.NoMatches if no match is found.


public int FindStringExact(string s)
    Member of System.Windows.Forms.ListBox

Summary:
Finds the first item in the System.Windows.Forms.ListBox that exactly matches the specified string.

Ответить

Номер ответа: 6
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #6 Добавлено: 29.12.10 14:59
чтобы выделялась найденная строка...
установите свойство listbox1.SelectionMode = MultiExtended
и код
  1.  
  2.  Private Sub Btnsearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsearch.Click
  3.         Dim searchString As String = Trim(LCase(TextBox3.Text)) 'получить строку для поиска
  4.         Dim countchar As Integer = Len(searchString) 'количество символов для сравнения
  5.         Dim searchOk As Boolean = False
  6.  
  7.         ListBox1.SelectedItems.Clear() 'очистить ранее выделенные строки
  8.         ListBox2.Items.Clear()
  9.  
  10.         If countchar = 0 Then
  11.             Exit Sub
  12.         Else
  13.             For I = 0 To ListBox1.Items.Count - 1
  14.                 Dim StringName As String = Trim(LCase(Mid(ListBox1.Items(I), 1, countchar))) ' в этой строке ищем
  15.                 Dim mChar As Boolean = String.Equals(StringName, searchString) ' результат сравнения строк
  16.  
  17.                 If mChar = True Then
  18.                     searchOk = True
  19.                     ListBox1.SelectedIndex = I
  20.                     ListBox2.Items.Add(ListBox1.Items(I))
  21.                 End If
  22.             Next
  23.         End If
  24.  
  25.         If Not (searchOk = True) Then MessageBox.Show("Строка """ & searchString & """ не найдена", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
  26.  
  27.     End Sub


Ответить

Номер ответа: 7
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #7 Добавлено: 29.12.10 15:05
в NET не принято юзать ф-ции усаревшего языка

это я понял. Спасибо!!!

FinfString(string s) - вернёт только первое вхождение, верно?
а как вернуть все вхождения?

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 29.12.10 15:07
:))))
опять ты за свое...

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 29.12.10 15:11
а как вернуть все вхождения?

Использовать цикл do ... while и вторую перегрузку метода FinfString,которая вторым параметром принимает индекс элемента с которого начинать поиск.
Либо, если ты знаком с лямбда-выражениями, это все можно сделать одной строкой

Ответить

Номер ответа: 10
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #10 Добавлено: 29.12.10 15:28
так правильно?
  1.  
  2.  Private Sub BtnFindString_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnFindString.Click
  3.         Dim searchString As String = TextBox4.Text 'получить строку для поиска
  4.         If Not (searchString = String.Empty) Then
  5.             Dim i As Integer = ListBox1.FindString(searchString)
  6.             If Not (i = -1) Then
  7.                 ListBox1.SelectedIndex = i
  8.             Else
  9.                 MessageBox.Show("Строка """ & searchString & """ не найдена", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
  10.             End If
  11.         End If
  12.     End Sub
  13.  

Ответить

Номер ответа: 11
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #11 Добавлено: 29.12.10 15:30
опять ты за свое...

Это пока я писал, Вы уже ответили, а я не видел....

Ответить

Номер ответа: 12
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #12 Добавлено: 29.12.10 15:31
с
с лямбда-выражениями
не знаком....

Ответить

Номер ответа: 13
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #13 Добавлено: 29.12.10 15:34
ну вот.. уже гораздо лучше.. только:
1. вместо If Not (searchString = String.Empty) Then используй String.IsNullOrEmpty
2. вместо If Not (i = -1) Then используй ListBox.NoMatches (так понятнее)
3. вместо "Строка """ & searchString & """ не найдена" используй String.Format

Ответить

Номер ответа: 14
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #14 Добавлено: 29.12.10 16:10
исправил...
  1.  
  2.  Private Sub BtnFindString_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnFindString.Click
  3.         Dim searchString As String = TextBox4.Text 'получить строку для поиска
  4.         ListBox1.SelectedItems.Clear() 'очистить ранее выделенные строки
  5.  
  6.         If Not (String.IsNullOrEmpty(searchString)) Then
  7.             Dim i As Integer = ListBox1.FindString(searchString)
  8.             If i <> ListBox.NoMatches Then
  9.                 ListBox1.SelectedIndex = i
  10.             Else
  11.                 Dim outString As String = String.Format("Строка '{0}' не найдена", searchString)
  12.                 MessageBox.Show(outString, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
  13.             End If
  14.         End If
  15.     End Sub
  16.  



попробую цикл do...while

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 29.12.10 16:25
  1.         With ListBox1.Items
  2.             .Add("МП-Ком правда")
  3.             .Add("Tanya")
  4.             .Add("Shannon")
  5.             ............
  6.             .Add("Магнолия")
  7.             .Add("Мурка")
  8.             .Add("Стрела")
  9.         End With

Странно что уважаемые корифеи ничего не сказали про этот кусок кода...

вместо того чтоб писать подряд кучу Add (кстати, тогда нужно до кучи вызывать и BeginUpdate/EndUpdate), достаточно один раз написать AddRange.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам