[VB6]Filteren van listview

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Wat ik met VB6 wil bereiken is het volgende:

Ik vul een listview met gegevens (datum,tijd,telefoonnummer, etc). Ik wil met een pop-up menu een filter kunnen plaatsen op één van de kolommen en zo de overige records filteren.

Ik heb bijvoorbeeld de listview gevuld met records vam 1-11-2004 t/m 19-11-2004. Plaats ik een filter op 5-11-2004, dan wil ik alleen de records zien van die dag, de rest mag weg. Hoe kan ik dit het beste aanpakken en het liefst zo dynamisch mogelijk.

Het gaat met name om de afwikkeling van de listview, de rest van de code (database-aanroep of collection) kom ik op zich wel uit. Zijn er mensen met ervaring hierin.

p.s. het werkt eigenlijk een beetje hetzelfde als de filter in Access (tabel)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:53

Creepy

Tactical Espionage Splatterer

Het ligt er maar net aan waar je wilt filteren.

Als alle data uit de DB komt, dan zou ik m.b.v. de query al gaan filteren op de waarden die je wilt hebben. Als het een probleem is om bij elke filter aanpassing de data opnieuw op te halen, dan zou ik filteren in de code die de data in je listview stopt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Ik haal alle gegevens op uit de database aan de hand van een datum-selectie. Deze worden in de listview geplaatst. Stel dat de gebruiker alleen de telefoongesprekken van toestel xxx wil kunnen zien, dan wil ik in de listview een filter laten plaatsen op het toestelnummer. Zo zijn er nog een aantal keuzes te maken die ik middels een filter wil bereiken. Het kan ook met een zoekfunctie, maar dat is iets omslachtiger, ik wil het met een filter-functie oplossen.

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Waarom doe je niet gewoon op basis van de filter criteria een nieuwe lookup naar de database? Als je een DB Listcontrol hebt is dat vrij eenvoudig. Anders kom je er toch op neer om de hele listview o.b.v. je criteria door te lopen en de niet matchende gegevens te verwijderen uit de listview...

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 14:56
Zoals Creepy al zegt.
Je hebt twee mogelijkheden:
1: Je haalt 1 keer de recordset op uit de database, houdt die locaal actief.
Vervolgens ververs je je listview bij iedere filtering.
(iets als
code:
1
2
3
4
5
6
7
sub na_filter
listview.clear
for each item in recordset
'test of dit item door het filter komt
listview.add item
next item
end sub)
Of:
2: Je haalt na iedere filteractie een nieuwe recordset op.
Dus: dynamisch een nieuwe querystring aanmaken, uitvoeren en de hele recordset in je listview proppen.

Hoe te kiezen:
nadeel van 1: Hogere belasting van clientmachine, bij meerdere gebruikers op de database kans op verouderde data
nadeel van 2: hogere belasting van DBserver en connecties.
Hier moet je eerst tussen kiezen, dan kan je pas verder.
BTW, qua programmeren is het allebei goed te doen, dus da's het probleem niet.
edit:
n.a.v. Woudloper: bij anders: een filter kan ook veranderen naar minder restrictief, dus je moet je data ergens op de achtergrond bewaren als je niet voor zijn andere oplossing gaat. Die is overigens meestal de handigste (is ongeveer mijn opl. 2)

[ Voor 14% gewijzigd door onkl op 19-11-2004 09:44 ]


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
ik ga denk ik gebruik maken van een collection, alleen mijn vraag is eigenlijk hoe kan ik controleren op welke data ik mote filteren. Ik klik een record aan in de listview en klik met de rechtermuisknop op één van de items (bv. telefoonnummer). Hier wil ik dus mijn filter-functie onder plaatsen.

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Je kunt toch de opgehaalde recordset filteren? Een recordset heeft de property Filter niet voor niks dacht ik zo.

oogjes open, snaveltjes dicht


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Right on, Don. Voor wat hij nodig heeft is de ingebouwde Filter waarschijnlijk voldoende en zeker het makkelijkste te implementeren. Let wel dat een Filter niet alle WHERE-clauses kan bevatten; ADO bevat slechts een beperkte SQL interpreter. Zie http://msdn.microsoft.com...do270/htm/mdprofilter.asp voor meer details.

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
waar ik nu tegen aanloop is het volgende:

Ik controleer alle regels in de listview of ze aan het filter voldoen. Zo ja, dan neem ik de volgende, zo niet moet deze verwijderd worden met het remove-commando. Dit werkt wel, echter als ik meerdere items ga verwijderen, dan loopt het vast met het aantal items in de lijst.

code:
1
2
3
4
5
for x = 1 to listview.listitems.count
    if listitem(x)=filter then
        listitem.remove(x)
    end if
next x

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

van achter naar voren :)

oogjes open, snaveltjes dicht


Verwijderd

Je moet die for next andersom doen

for x = listview.listitems.count to 1 step -1

Zoiets iig, alhoewel waarom een 1? Een listbox start altijd met een 0.

//edit: weer eens te laat, tis nog vroeg :z

[ Voor 17% gewijzigd door Verwijderd op 22-11-2004 09:28 ]


  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
Een mogelijkheid is de for-next achterstevoren doorlopen, een andere methode is

Visual Basic:
1
2
3
4
5
6
7
8
9
do
    if listitem(x)=filter then
        listitem.remove(x)
        x=x-1
    end if

 if x = listview.listitems.count then exit do

loop


Deze is ranzig omdat je uitgaat van een oneindige lus, maar het is mogelijk

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
't is al opgelost en werkt perfect ! Mijn dank

Verwijderd

Voor lists met veel items kent Windows een aparte control, de virtual listview.
Deze control lijkt qua uiterlijk op een listview. Het verschil zit hem in het beheer van de data: bij de virtual listview wordt dit extern beheerd. Dit geeft mogelijkheid voor prefetching, iterators, filters, etc.

De virtual listview is niet direct in VB te gebruiken, maar er zitten aardige ideeen achter. Zie MSDN voor de details :Y) .

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 19-05 20:34

Gerco

Professional Newbie

Op Planet Sourcecode staat een virtual listview voor VB als Usercontrol. Hij is wat lastig soms, maar werkt prima en SNEL!

Ik heb wat stabiliteitsproblemen gevonden op het moment dat je er een modal form overheenzet als de listview de focus heeft en er zijn nog wat andere focusproblemen (als je er twee hebt, stuitert de focus soms oneindig heen en weer, nog geen reden of oplossing voor gevonden).

Als je de kinderziektes eruit weet te slopen is het een prima control, zelf heb ik dat niet gedaan want de problemen zijn maar af en toe en ik heb toch geen belangrijke app, het is maar voor thuisgebruik.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1