Problem mit Listview ColumnHeader Position

MareikeRemmel

Grünschnabel
Hallo!
Ich habe eine Programm, welches am Anfang aus einer Ini Datei die Spaltenpositionen des Listviews ausliest und beim Beenden wieder reinschreibt.
Leider funktioniert das mit dem Zuweisen nicht korrekt.
Ich erstelle die Spalten dynamisch, dann nehme ich den String, den ich aus dem Inifile gelesen habe und trenne ihn mit der Funktion Split
so habe ich ein Array.
Code:
Debug.Print cttorder
ipos = Split("1,14,4,2,5,3,7,10,9,8,12,15,13,11,6,16,17,18", ",")

Dann weiße ich jeder Spalte ihre Position zu

Code:
' Positionen zuweisen

With lisWarteschlange.ColumnHeaders
  
  'countct Anzahl der Spalten
  For i = 0 To countct - 1
    .Item(i + 1).Position = CInt(ipos(i))
  Next i

End With

Die Spalten bekommen auch die Werte zugewiesen wie es sein soll...
aber wenn ich dann die Schleife weiter durchgehe passiert es an manchen stellen, dass Positionen einfach verändert werden, denen ich schon eine Position zugewiesen hatte.
Somit stimmt die Reihenfolge nicht mehr.
Dazu hier mal ein Beispiel.


Code:
so steht es im Inifile
1,14,4,2,5,3,7,10,9,8,12,15,13,11,6,16,17,18


So sehen die Positionen aus, nachdem 1. 2. 3. usw Durchlauf der For-Schleife
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
1,14,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,
1,14,4,2,3,5,6,7,8,9,10,11,12,13,15,16,17,18,
1,14,4,2,3,5,6,7,8,9,10,11,12,13,15,16,17,18,
1,14,3,2,5,4,6,7,8,9,10,11,12,13,15,16,17,18,
1,14,4,2,5,3,6,7,8,9,10,11,12,13,15,16,17,18,
1,14,4,2,5,3,7,6,8,9,10,11,12,13,15,16,17,18,
1,14,4,2,5,3,6,10,7,8,9,11,12,13,15,16,17,18,
1,14,4,2,5,3,6,10,9,7,8,11,12,13,15,16,17,18,
1,14,4,2,5,3,6,10,9,8,7,11,12,13,15,16,17,18,
1,14,4,2,5,3,6,9,8,7,12,10,11,13,15,16,17,18,
1,13,4,2,5,3,6,9,8,7,11,15,10,12,14,16,17,18,
1,12,4,2,5,3,6,9,8,7,10,15,13,11,14,16,17,18,
1,12,4,2,5,3,6,9,8,7,10,15,13,11,14,16,17,18,
1,13,4,2,5,3,7,10,9,8,11,15,14,12,6,16,17,18,
1,13,4,2,5,3,7,10,9,8,11,15,14,12,6,16,17,18,
1,13,4,2,5,3,7,10,9,8,11,15,14,12,6,16,17,18,
1,13,4,2,5,3,7,10,9,8,11,15,14,12,6,16,17,18,



Wie man sieht verändert er irgendwann einfach die Positionen, von den zuvor zugewiesenen Spalten und am Ende passt der letzt String nicht mit dem String zusammen, der im inifile gestanden hat.

Z.B. Zeile 5 dort steht plötzlich an der 3 Stelle die Position obwohl im dritten Durchlauf der 3. Spalte die 4. Position zugewiesen wurde.

Das gleiche passiert in der Zeile 7.
Hier wird der Spalte 8 die Position 10 zugewiesen, im gleichen Schritt wird die Position der Spalte 7 einfach auf 6 gesetzt obwohl im 7 Durchlauf die Spalte 7 die Position 7 zugewiesen bekommen hat.

Ich habe das ganze auch schon mal in einem neuen Projekt getestet. Um auszuschließen, dass es sich hierbei um ein Bug in dem "großen" Projekt handelt.
Aber auch dort tritt das gleiche Symptom auf.
Auch wenn ich die Positionen nicht in der Schleife sondern hart kodiert eingebe.
Hat jemand eine Idee.. was das ist. Hat das Listview evtl. einen Bug. Gibt es dafür einen Patch?
Ich verwende Microsoft Windows Common Controls 6.0 (SP 6)


Vielen Dank!
 
Hallo Mareike,

also ich hab da mal ne These.
Code:
ipos = Split("1,14,4,2,5,3,7,10,9,8,12,15,13,11,6,16,17,18", ",")
With lisWarteschlange.ColumnHeaders
    'countct Anzahl der Spalten
    For i = 0 To countct - 1
        .Item(i + 1).Position = CInt(ipos(i))
    Next i
End With

Gehen wir das ganze mal Stück für Stück durch.
i = 0; Setzte Spalte 1 auf Position 1
i = 1; Setzte Spalte 2 auf Position 14
i = 2; Setzte Spalte 3 auf Position 4
i = 3; Setzte Spalte 4 auf Position 2 --> Ist aber die schon verschobene Spalte 3
i = 4; Setzte Spalte 5 auf Position 5
i = 5; setzte Spalte 6 auf Position 3
i = 6; setzte Spalte 7 auf Position 7
i = 7; setzte Spalte 8 auf Position 10
i = 8; setzte Spalte 9 auf Position 9
i = 9; setzte Spalte 10 auf Position 8 --> Ist aber die schon verschobene Spalte 8
...
Analysiere mal weiter. Du verschiebst bereits verschobene Spalten, und wirst so sicherlich nie das gewünschte Ergebnis erhalten.

Meiner Meinung nach solltest Du die Spalten nicht über Ihre Indexnummer, sondern über Ihren Key verschieben. Nun weis ich nicht, ob Du die Spalten zur Laufzeit oder während der Designzeit generierst. Du solltest aber jeder Spalte einen Eindeutigen Key zuweisen, über den Du dann die Position festlegen kannst.

z. B. Key Spalte 1 = A01
Key Spalte 2 = A02
usw.

Nun kannst Du Deine Schleife wie folgt ändern:
Code:
ipos = Split("1,14,4,2,5,3,7,10,9,8,12,15,13,11,6,16,17,18", ",")
With lisWarteschlange.ColumnHeaders
    'countct Anzahl der Spalten
    For i = 0 To countct - 1
        .Item(Format$(i + 1, "A0#")).Position = CInt(ipos(i))
    Next i
End With

Maybe it helps
Das Orakel
 
Hallo Orakel,
vielen Dank, dass du dir über mein Problem Gedanken gemacht hast. Allerdings funktioniert das auch nicht mit dem Key.
Ich werde gleich vielleicht noch einmal probieren, wenn man die Spaltenpositionen nicht in der Reihenfolge der Keys bzw. Items zuweist sondern in der Reihenfolge der Position.
Sprich zunächst die Position1 zuweisen, dann die Position 2 zuweisen usw.
Mal sehen ob das klappt.

Sollte jemand anderes noch eine Idee haben, dann her damit :)
 
Moin Mareike,

solche Aufgabenstellungen reizen mich natürlich. Ich glaube ich hab ne Lösung. Anhängendes Projekt verdeutlicht das ganze. Grundüberlegung ist die Reihenfolge so zu sortieren, dass die letzte Spalte zuerst Positioniert wird, und die erste Spalte zuletzt. Also Positionierung von 18 - 1.

Gruß
Das Orakel
 

Anhänge

  • Listview.zip
    2,1 KB · Aufrufe: 25
Hi Orakel,

ja... habe es nun auch so in der Art gemacht.
Speichere die Sollpositionen und die Items in einem zweidimenionalem Array diesen Sortiere ich dann.
Danach kann ich das Array durchgehen und ordne die Positionen nun von 1 bis 18 zu und nicht die Items 1 - 18 oder Keys 1 - 18
Code:
Private Sub Form_Load()

Dim ctorder As String
Dim ipos As Variant
Dim feld() As Integer
Dim i, j as Integer

ListView1.ColumnHeaders.Add 1, "A1", "Sp1", 600
ListView1.ColumnHeaders.Add 2, "A2", "Sp2", 600
ListView1.ColumnHeaders.Add 3, "A3", "Sp3", 600
ListView1.ColumnHeaders.Add 4, "A4", "Sp4", 600
ListView1.ColumnHeaders.Add 5, "A5", "Sp5", 600
ListView1.ColumnHeaders.Add 6, "A6", "Sp6", 600
ListView1.ColumnHeaders.Add 7, "A7", "Sp7", 600
ListView1.ColumnHeaders.Add 8, "A8", "Sp8", 600
ListView1.ColumnHeaders.Add 9, "A9", "Sp9", 600
ListView1.ColumnHeaders.Add 10, "A10", "Sp10", 600
ListView1.ColumnHeaders.Add 11, "A11", "Sp11", 600
ListView1.ColumnHeaders.Add 12, "A12", "Sp12", 600
ListView1.ColumnHeaders.Add 13, "A13", "Sp13", 600
ListView1.ColumnHeaders.Add 14, "A14", "Sp14", 600
ListView1.ColumnHeaders.Add 15, "A15", "Sp15", 600
ListView1.ColumnHeaders.Add 16, "A16", "Sp16", 600
ListView1.ColumnHeaders.Add 17, "A17", "Sp17", 600
ListView1.ColumnHeaders.Add 18, "A18", "Sp18", 600

ctorder = "1,14,4,2,5,3,7,10,9,8,12,15,13,11,6,16,17,18"
ipos = Split(ctorder, ",")
ReDim feld(UBound(ipos), 1) 'Zweidimensionales Array

For i = 0 To UBound(ipos)
 feld(i, 0) = ipos(i)     'Das Array mit den Positionen füllen
 feld(i, 1) = i + 1       'Das Array mit den dazugehörigen Items füllen
Next

'Nach dem Positionen sortieren, hier immer auch die Items mittauschen
For i = 0 To UBound(ipos) - 1
  For j = 0 To UBound(ipos) - 1 - i
    If feld(j + 1, 0) < feld(j, 0) Then
      tmp = feld(j, 0)
      tmp2 = feld(j, 1)
      feld(j, 0) = feld(j + 1, 0)
      feld(j, 1) = feld(j + 1, 1)
      feld(j + 1, 0) = tmp
      feld(j + 1, 1) = tmp2
    End If
  Next
Next i

'Nun die sortierten Positionen dem Listview zuordnen
For i = 0 To 17
  ListView1.ColumnHeaders.Item(feld(i, 1)).Position = feld(i, 0)
Next i
End Sub


:) Das klapp !
 

Neue Beiträge

Zurück