EDGV – brugere og deres krav til sortering og opsætning…
Jeg overvejede muligheden for at lave en kontekst-menu, men det virkede lidt uoverskueligt at få puttet alt den funktionalitet på et uvist antal kolonner ned i en simpel hierakisk menu, så jeg valgte istedet at lave et par hjælpe-forms til formålet. Først lavede jeg den avancerede søgning. BLW anvender en streng ligesom en SQL-sætning til avanceret sortering, så jeg lavede en form med 3 sæt sorteringsnøgler (på et tidspunkt skal jeg have lavet, så man kan have flere… men det er så enkelt at det kan vente til der er brug for dem) – en label og to combobokse, en til propertien og en til sorteringsretningen. Største udfordring var sådan set, at få søgestrengen parset i concstructoren, når brugeren vil ændre den – det ville være fjollet at han skulle lave det hele forfra fordi han ville ændre retningen. Eftersom jeg i EDGV har en liste med properties, var det enkelt at sende den med op, til at populere comboboksene.
Til opsætning af kolonnerækkefølge, skrivebeskyttelse og visning – lavede jeg en form med et… EDGV… derved kan jeg styre opsætningen af opsætningsformens opsætningsform…. osv… Jeg lavede et par knapper til at rykke en kolonne op og ned og en til at resette XML-filen til defaults. Ikke en hel masse besværligheder bortset fra en enkelt detalje… jeg blev til sidst nødt til at re-painte hele gridviewet, når jeg havde ændret i listen – selv INotifyPropertyChanged er ikke nok her – og jeg havde valgt en List<T> til datagrundlag, da brugeren ikke måtte kunne sortere ved et uheld i netop denne liste. List<T> har ingen support for ListChanged – og da jeg er doven af natur, var den pragmatiske løsning blot at gentegne EDGV’et. Det er små collections med disse XML-filer og det er ikke det store problem performancemæssigt.
For at håndtere popup-lister til at vise relaterede objekter, brugte jeg den Boolean, jeg har med i constructoren. Hvis den er sat til true, laver jeg kun en generisk kolonne – og denne kolonne viser så et antal linjer (ud fra det tredje index jeg havde med i XML-filen fra start – -1 betyder så at property’en ikke vises) per objekt.
For at vise popup’en, anvender jeg OnControlShowing-eventet, til at abonnere på en TextBox’ens TextChanged, KeyDown og Leave. TextChanged bruger jeg til at slå en liste op over mulige valgmuligheder, kaste dem til en form, hvis eneste bestandel er en EDGV – borders osv. er fjernet. Fokus sendes tilbage til textboxen, fordi jeg samtidig anvender TextChanged til at danne den søgestreng, jeg afgrænser listen med. Det giver en fed effekt med at popupen opdateres efterhånden som brugeren taster i textboxen. KeyDown bruger jeg til at ‘fjernstyre’ popup’en. Dvs. piltasterne til at bevæge selektionen, ESC til at lukke den, Enter til at vælge i listen osv. Leave bruger jeg til at fjerne abboneringen på events. (for en sikkerheds skyld fjerner jeg dem også før jeg kobler dem på. DataGridViewet har vist sig lidt buggy på det område – og der kommer ikke en fejl ud af at prøve at fjerne en eventhandler der ikke er der.)