22. februar 2006 - 14:36Der er
10 kommentarer og 1 løsning
Skal gemme column width over sessions
Hej experter.
Jeg skal gemme breden på min columns i mit ListView over sessions og også ved visning af forskellige lists over den samme session. Jeg har haft kigget Settings mekanismen og det kan jeg fint få til at virke når jeg skal gemme fx WindowLocation og WindowBounds over sessions.
Mit problem er at jeg har skrevet en eventhandler til list_ColumnWidthChanged, men den bliver desværre kaldt hver gang jeg indsætter en ny column i mit listview med det resultat at jeg, når jeg forsøger at aflæse nuværende størrelse på column nummer 2 er den jo endnu ikke lavet...
Jeg kan sgu ikke lige lure hvordan jeg kommer uden om denne lille irriterende feature!!
Nogle derude der har forsøgt sig med ovenstående? At gemme column breden på alle de columns der er i en given application under uderprofile med enden den indbyggede Settings class eller via noget selv kreeret?
kan du ikke indsætte et check i din ColumnWidthChanged handler som ser om det er en ny kolonne (ved ikke helt hvilken property man kan tjekke der, det er bare en ide)
Du gav mig en ide til hvordan jeg kunne undgå at det lavede en nullpointer. Eventen fortæller mig hvilken kolonne der er blevet ændret, men det er desværre noget forfærdelig udynamisk kode. Det skal virkelig fedtes ind når der engang skal barberes en kolonne mere ind! Det vill jeg helst gerne også kunne undgå.. Og MS's eksempler er, som altid, gode, men lige lovlig simple...
Jeg tror i bund og grund at jeg er på vej ned at den forkerte path...
Nedenstående er jo ikke fandens dynamisk... men OK. Når det een gang er skrevet så virker det.
Private Sub list_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnWidthChangedEventArgs) Handles list.ColumnWidthChanged
Select Case listChosen
Case ShowList.LIST1
Select Case e.ColumnIndex Case 0 My.Settings.list1column1 = list.Columns.Item(0).Width Case 1 My.Settings.list1column2 = list.Columns.Item(1).Width Case 2 My.Settings.list1column3 = list.Columns.Item(2).Width End Select
Case ShowList.LIST2
Select Case e.ColumnIndex Case 0 My.Settings.list2column1 = list.Columns.Item(0).Width Case 1 My.Settings.list2column2 = list.Columns.Item(1).Width Case 2 My.Settings.list2column3 = list.Columns.Item(2).Width End Select
Case ShowList.LIST3
Select Case e.ColumnIndex Case 0 My.Settings.list3column1 = list.Columns.Item(0).Width Case 1 My.Settings.list3column2 = list.Columns.Item(1).Width Case 2 My.Settings.list3column3 = list.Columns.Item(2).Width End Select
Du får jo "sender" med i event handleren, så den må du kunne bruge til at give dig listen der forandres, så skal du "bare" konvertere sender til det rigtige object og så burde du kunne nøjes med én select/case...
Jo jo, men mit problem er at jeg laver en list.clear() inden jeg laver min liste hvergang og når den kommer til at skulle udfylde den kaster den en list_ColumnWidthChanged event hvor hver eneste kolonne jeg laver. I selve event metoden kan jeg jo så ikke begynde at hente breden af kolonne 2 endnu da den ikke er blevet lavet. Det giver en nullpointerexception.
Som vist i ovenstående har jeg løst det ved kun at kigge på den pågældende kolonne istedet for dem alle på een gang. Det har løst det, men jeg synes ikke umiddelbart det er specielt flot. Det kan være, når jeg har arbejdet med det nogle måneder, at jeg finder ud af hvordan jeg laver det rigtig smart.
Det jeg mener med at det er usmart er at jeg skal til at lave en My.Setting variable mere for hver gang jeg synes at jeg vil tilføje en kolonne og jeg skal tilføje den til min event kode. Og forestil dig en application med mange listviews med mange kolonner!! Det ender med at blive en forfærdelig masse My.Settings variabler man skal holde øje med...
Jo det kan jeg men det vil jo i givet fald betyde en masse trals kode der skal vedligeholdes.
Jeg har lavet en løsning hvor jeg sætter en boolean til false hver gang jeg bygger listen og når listen er bygget sætter jeg den til true igen og i eventkoden tjekker om om denne er true eller false ingen jeg overhovedet gør andet.
Men det er en løsning hvor jeg har een variable per de ting jeg gerne vil gemme på. Og det er et meget simpelt demo program jeg har lavet og det har nu allerede 30 huske variabler. Det bliver sgu svært at finde rundt i dem tilsidst.. Men når det så er lavet så virker det også som det skal
Hvad får du tilbage som sender? kan det ikke minimere det du skal undersøge? og så tjekke om column er defineret før du sætter bredden, du kunne jo have et array af bredder for hver liste, for at gøre antallet af variabler lidt mindre (hvis du ikke allerede har gjort det)
Men du er lidt galt på den. Jeg har løst det. Det er ikke noget der ikke virkere. Jeg ville bare gerne om det kunne laves smartere. Mere dynamisk istedet for een variable til hvert liste eller sågar en variable til hver column
Ikke via VS 2005. Men jeg kan gøre det ved selv at kode det i Settings.vb filen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.