Archief - VB.NET TextChanged Sub

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

JasonC

Legacy Member
Ik ben bezig met een progje te schrijven in vb, nu wil wil ik ergens in mijn prog kunnen zoeken via een textchanged en de resultaten in een listbox weergeven. Er worden dan gegevens uit een database gehaald in een aparte klasse via sql code: ... Like ... '%"
dit is mijn sub:

Code:
    Private Sub txtZoekgebruiker_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtZoekgebruiker.TextChanged

        Dim g As New Gebruikers
        g.tezoeken = txtZoekgebruiker.Text
        g.zoekgebruiker()
        lsbGebruikers.DataSource = g.zoekgebruiker

    End Sub

alles gaat goed als ik bezig ben met de eerste letters te schrijven, maar als ik backspace gebeurt er nix, alle resultaten blijven er staan, en als ik backspace tot er nix meer in de textbox staat, dan komen gewoon alle resultaten te staan in die listbox.
Weet iemand hoe ik dit kan oplossen?

voltje

Legacy Member
No offence maar als je elke keer naar je database gaat als je text veranderd in de textbox lijkt me dit niet zo een goed idee?
Beter je database uitlezen en een list opvullen?
En op regelmatige tijden uw database en List vergelijken en aanvullen.

En het kan zijn dat als je 1x backspaced dat de resultaten het zelfde blijven?
Maar toch raar...
En datasource op null zetten waarom zou je dat doen?

Je datasource wordt toch ieder textchanged event gewijzigd?

En kwestie van iets korter te werken kan je je code aanpassen zodat je kan doen:
Dim g As New Gebruikers
lsbGebruikers.DataSource = g.zoekgebruiker(txtZoekgebruiker.Text)

Debug eens en kijk steeds voor je queried wat er in de variabele zit waar je op zoekt...
En voer dezelfde query in in sql server of wat je ook gebruikt...
En vergelijk de resultaten daar eens met die van je programma.

Moto

Legacy Member
En datasource op null zetten waarom zou je dat doen?
Is idd hier niet nodig, is een hack voor syncfusion listboxes die ik bij de huidige klant moet gebruiken :s

No offence maar als je elke keer naar je database gaat als je text veranderd in de textbox lijkt me dit niet zo een goed idee?
Waarom zou dat geen goed idee zijn?
Voor een autocomplete te maken is dit bv al een goed idee
Stel dat er 10.000 items in uw DB zitten die gaat ge toch niet allemaal ophalen om in een lijst te steken.

Nu als ik zoiets moet doen werk ik wel met een delay , komt er op neer dat ik de actie om de data op te halen schedule bv binnen de 300ms, komt er binnen de 300ms nog een andere textchanged binnen wordt de eerste gecancelled en restart de timer

voltje

Legacy Member
Goh ja maar ge kunt ook uw client - database verkeerd verkleinen door alles clientside op te slagen en op bepaalde frequentie te synchroniseren...

Da verhoogd de snelheid van uw programma...

Want als ge het woord "Programmeren" zoekt.
En ge hebt 30000 records.

En ge typt de P traag => veel database verkeerd.
De typt daarna de R me genoeg pauze tussen => veel database verkeer...
(dus als ge traag typts hebde veel database verkeer en uw 300ms delay wordt ni gehaald)

Ge bent het beste met als ge gewoon de database gegevens clientside bijhoud en wanneer er gegevens toegevoegd worden alle clients verwittigen en weer synchroniseren?
Da verhoogt naar mijn mening toch uw prestaties van uw programmas

Let op, ik zeg ni da ge altijd alles uit u database moet halen...
Maar op sommige momenten denkik da da wel handig zou kunnen zijn...

Cycloon

Legacy Member
Veel succes met alles binnen te halen als je een databank hebt van enkele GB groot. Het voordeel van een databank is net dat je er snel in kan zoeken, en dat voordeel ga jij weghalen door alles eerst in een lijst in je client geheugen te steken (die sowieso te klein zal zijn in dit voorbeeld :)). Bij veel resultaten kan je die uiteraard beperken tot bv de 100 beste of w/e.

voltje

Legacy Member
Zoals ik zei: "ik zeg niet dat je dat altijd moet doen".
Maar het kan handig zijn, maar dan niet van enkele gb groot.

Maar ik denk nu ook niet dat een standaard programma massas query's zal doen op alle records van die GB's grootte database...

En tuurlijk is het nut van een database wat jij zegt :)

Maar soms is er overbodige database trafiek die je kan oplossen...

Zoals je bvb hebt

Client - Server - Database.

De Server is u laag boven u db en kan dan zoals ik zei frequentief synchroniseren met de database.

Maar ik heb het hier niet over alles he.
Ik besef ook wel dat ge voor heeeel wat zaken naar de database MOET.

Maar er zijn altijd zaken waar dit wel kan dat ik bedoel.

En voor autocomplete zaken vind ik da wel handig :)

Moto

Legacy Member
Goh ja maar ge kunt ook uw client - database verkeerd verkleinen door alles clientside op te slagen en op bepaalde frequentie te synchroniseren...

Da verhoogd de snelheid van uw programma...
Dat is zeker waar voor van die kleine lijstjes die praktisch nooit veranderen, dat gebruik ik ook ze :)

Trouwens voor het autocomplete voorbeeld dat ik geef haal ik enkel de eerste 10 items op.
En dat is "blazingly fast" :p

tis gewoon na x aantal records is het waanzin om ze allemaal op te halen en in een combo of listbox te duwen.
Der is geen algemene technische oplossing voor die dingen, enigste regel is dat het spel snel en goed werkt en dat de user gemakkelijk zen werk kan doen

PS: 300ms maar op 500ms gezet :)

JasonC

Legacy Member
Het probleem is al opgelost:
Code:
        lsbklanten.DataSource = Nothing

        Dim k As New Klanten
        Me.txtklantzoeken.Text = Me.txtklantzoeken.Text.Trim(Chr(8))
        If (Me.txtklantzoeken.Text.Length > 0) Then
            k.tezoeken = txtklantzoeken.Text
            k.zoekklant()
            lsbklanten.DataSource = k.zoekklant
        End If
Bedankt voor alle reacties! :D

BitterBAL

Legacy Member
dacht ik nu ook ... zeker als je een like statment gebruikt in uw sql
like "", alles is like "" :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan