[ Mare_Bogovadja @ 04.08.2004. 21:36 ] @
[VB.NET]

Radim na jednom programcicu u kome na jednom mestu treba odabrati stavku iz listboxa. Posto tih stavki ima bas mnogo [oko 800-900] resio sam da napravim malu formu koja bi sluzila za pretragu a sastoji se od textboxa u kom bi se kucalo i listboxa gde bi se rezultati filtrirali prema textu iz textboxa. Znam da sam zakomplikovao ali to bi trebalo da izgleda kao pretraga u Winampu [kad pritisnes F3].

To sam pokusao da postignem ovim kodom dole, ali on ne da ne radi, nego pravi neku pretragu od koje da Bog sacuva.:-[

Ako ima neko da ga ne mrzi neka vidi ovo i nek mi kaze gde sam pogresio.

Code:

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        'deklarisem promenljive

        Dim s As String = Me.TextBox1.Text
        Dim p As Object
        Dim i, j As Integer
        Dim b() As Integer = New Integer(j) {}

        'prolazim kroz elemente listboxa

        For Each p In Me.ListBox1.Items

            'proveravam da li u njima postoji ono sto je u textbox-u

            If InStr(CStr(p), s.ToLower) = 0 Then

                'upisujem njihove indexe u niz

                b(j) = i
                j = j + 1
                ReDim b(j)

            End If

            i = i + 1

        Next

        'ovde brisem neodgovarajuce clanove na osnovu njihovih indexa

        For Each i In b

            Me.ListBox1.Items.Remove(Me.ListBox1.Items.Item(i))

        Next

    End Sub

End Class


Svaka pomoc je dobrodosla, unapred hvala.
[ akrosoft @ 04.08.2004. 22:32 ] @
A sta ces ako korisnik pogresi pri kucanju pa krene da brise a ti si vec izbrisao odredjene iteme iz listboxa? Pored toga, mislim da ti je bolje da koristis ArrayList umesto niza, da ga ne bi stalno redimenzionisao.

Anyway... mislim da te ovo zeza, ti prilikom brisanja odredjenog itema iz listboxa tumbas i sve indexe itema koji se nalaze iza njega u nizu. Probaj da umesto
For Each i In b
naprvis obicnu decrement for petlju od poslednjeg itema do prvog. Time izbegavas da se preostali indexi itema koji te interesuje menjaju. Da....brisanjem itema u prvoj for each petlji bi totalno zablesavio petlju, tako da moras da pravis neki niz gde ces smestiti indexe......



[ bunker @ 05.08.2004. 00:41 ] @
imas f-ju kontrole ListBox FindString. FindString vracca index prvog pronadjenog indexa u listboxu. FindString kao opcioni parametar ima integer od kog indexa da zapocne pretragu

Code:
dim index as Integer = ListBox1.FindString("trazeniString", zaljeniIndex)


Code:

dim tmpList as ListBox  'temprary list box
dim txtTrazeniString as TextBox

Sub FillTmpList(optional idx as Integer = -1)
  'postavlajs pocetni index -1 da bi findString poceo pretragu od pocetka
  dim currIdx as Integer = ListBox1.FindString(txtTrazeniString.Text, idx)
  if (currIdx =  ListBox.NoMatches) then 'znaci nije ga nasao
    tmpList.Items.Clear 'ovde uklanjas sve iz temporary liste. mozda je sintaksa 
    'malo drugacija(Clear, RamoveAll, nisam siguran)
    return 'izlazis iz procedure
  else 
    tmpList.Items.Add(ListBox1.Items(currIdx))
    Me.FillTmpList(currIdx) 'malo rekurzije, mozda cces morati da currIdx     
      'inkrementiras
  end if
end sub

ovo sam nalupao na brzinu, nisam proverio, ali trebalo bi da radi. citaj malo MSDN. nije to toliko lose :)

P.S. ja bih ovu f-ju pozivao na event txtTrazeniString.TextChanged



[ akrosoft @ 05.08.2004. 13:06 ] @
Citat:
bunker
Me.FillTmpList(currIdx) 'malo rekurzije, mozda cces morati da currIdx
'inkrementiras


Ovo ce ti se vrteti beskonacno, jer FindString prolazi kroz ceo listbox pa krece ponovo od prvog itema, tako da ako zeljeni item postoji u listu uvek ce ga nalaziti.
[ akrosoft @ 05.08.2004. 13:32 ] @
Probaj ovako:
Code:

Dim i As Integer
For i = ListBox1.Items.Count - 1 To 0 Step -1
   If Not CStr(ListBox1.Items(i)).ToLower.StartsWith(TextBox1.Text.ToLower) Then
      ListBox1.Items.RemoveAt(i)
   End If
Next


....mozda moze jos da se optimizuje, ne stojim najbolje sa sintaksom VB-a.....

[ Acid @ 05.08.2004. 20:47 ] @
ja mislim da ti je najbolje da deklarises niz, jednom u njega ubacis sadrzaj liste, i onda sam pretrazujes niz. sigurno ima biljih resenja, ali tako resavas broblem brisanja stavki iz liste.
[ Mare_Bogovadja @ 06.08.2004. 14:08 ] @
Hvala svima koji su pokusali da odgovore, pomogli su mi da dodjem do resenja.

Ovo ispod radi[bas kao u winampu ]

Code:

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        Me.ListBox1.Items.Clear()
' ovo je deo iz deklaracije listboxa        
        Me.ListBox1.Items.AddRange(New Object() {"Clan1", "clan2"}) ' i tako dalje
        Me.ListBox1.Location = New System.Drawing.Point(80, 80)
        Me.ListBox1.Name = "ListBox1"
        Me.ListBox1.Sorted = True
        Me.ListBox1.Size = New System.Drawing.Size(376, 121)
        Me.ListBox1.TabIndex = 0

        Dim s As String = Me.TextBox1.Text
        Dim p As Object
        Dim i, j, k As Integer
        Dim b() As Integer = New Integer(j) {}

        For Each p In Me.ListBox1.Items

            If InStr(CStr(p), s.ToLower, CompareMethod.Text) = 0 Then

                b(j) = i
                j = j + 1
                ReDim Preserve b(j)

            End If

            i = i + 1

        Next

        If b.Length > 0 Then

            For k = b.Length - 2 To 0 Step -1

                Me.ListBox1.Items.Remove(Me.ListBox1.Items.Item(b(k)))

            Next

        End If

    End Sub

End Class


Pozdrav iz Bogovadje