Avatar billede bootie Nybegynder
22. februar 2006 - 14:36 Der 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?
Avatar billede ladyhawke Novice
22. februar 2006 - 14:53 #1
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)
Avatar billede bootie Nybegynder
22. februar 2006 - 15:16 #2
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

            Case Else

        End Select

    End Sub

Man må kunne lave det smartere.
Avatar billede ladyhawke Novice
22. februar 2006 - 20:53 #3
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...
Avatar billede bootie Nybegynder
22. februar 2006 - 21:02 #4
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...
Avatar billede ladyhawke Novice
27. februar 2006 - 18:52 #5
kan du ikke tjekke om den kolonne du kigger på er tom (Count=0 på elementerne)? I så fald undlade at sætte width
Avatar billede bootie Nybegynder
27. februar 2006 - 19:37 #6
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
Avatar billede ladyhawke Novice
28. februar 2006 - 16:52 #7
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)
Avatar billede bootie Nybegynder
01. marts 2006 - 01:04 #8
man har ikke umiddelbart mulighed for at gemme et array i My.Settings

Så skal man ind og skrive det selv i hvert fald.
Avatar billede bootie Nybegynder
01. marts 2006 - 01:06 #9
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
Avatar billede ladyhawke Novice
01. marts 2006 - 09:17 #10
Det var så sandelig også det jeg kommenterede (en nemmere måde at gøre det på...) Du kan ikke selv lave et Array som bliver anbragt i UserProfile?
Avatar billede bootie Nybegynder
01. marts 2006 - 09:29 #11
Ikke via VS 2005. Men jeg kan gøre det ved selv at kode det i Settings.vb filen.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester