ListBox Spaltenweise füllen!



  • Hi,

    ich hab hier das Problem, das ich eine ListBox spaltenweise füllen muss. Die erste Spalte enthält die Beschriftungen und bleibt immer gleich lang (150 einträge). Die anderen Spalten sind dann für die Werte zuständig. Wenn ich jetzt also 170 Werte hab dann sollen die letzten 20 in der 2. Spalte eingetragen werden. Und wenn ich halt über 320 Werte hab dann sollen die letzten 20 eben in Spalte 3 eingetragen werden usw...

    Die Funktion AddItem unterstüzt nur ein Zeilenweises eintragen... da ich aber nicht weis wieviele Spalten ich brauche kann ich das schlecht benutzten. Weis einer einen Rat?

    schonmal danke für eure Hilfe



  • Hi,

    ich bin neu hier aber das wird mich nicht abhalten dir zu helfen. also mein erster post ➡
    was du brauchst ist die methode:

    BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);
    

    nItem = ID des Items
    nSubItem = ID deiner Spalte
    LPCTSTR = Zeiger auf deinen String (oder halt der String selbst)

    also wenn dein Dialog die Membervariable:

    CListCtrl m_myList;
    

    ist dann
    einfach:

    m_MyList.SetItemText(nIDdesItems,nSpalte,strMeintext);
    

    schreiben

    Wichtig: Soweit ich das weiß, ist nItem (ID) des Items fest (und eindeutig!). Also das 20. das du in deiner Liste siehst hat nicht zwangsläufig die ID 19 ! Das gleiche gilt auch für die Spalten (Columns). Stell dir einfach eine Zeile als Vector vor in der alles der Reihe nach drinn steht. Änderungen an der ListView (vertauschen der Spalten, sortieren usw.) ändert nichts am Vektor sondern nur die Darstellung in der ListView.

    Bonus:

    BOOL GetColumnOrderArray(LPINT piArray, int iCount = -1);
    

    piArray : Zeiger auf ein Integerarray -> dieses bekommt dann die aktuell angezeigte Reihenfolge der Spalten
    iCount : Gibt an wie viele Elemente ausgelesen werden sollen, wenn nichts oder -1 angegeben versucht das ListView selber die gesamtzahl zurückzugeben

    ps. die methode AddItem() könntest du schon nutzen, da ein Item alle Informationen einer "Zeile" beinhalted. Du müsstest aber vorher das Label (dein text ganz links) auslesen und durch das neue Item ersetzt werden......
    eigentlich programmiertechnisch humbug ABER wenn du das einmal auf diese Weise durchziehst dann hast du:
    1. ListCtrl funktionsweise verstanden
    2. Item-struktur verstanden
    3. Masken verstanden



  • @hal9000: Er weiß ja wie eine ListCtrl funktioniert.

    Mach doch eine Schleife. Wenn GetItemCount erreicht dann beginne wieder von vorne.
    Willst du bei letzten weiter machen merke dir die POS oder gehe die Einträge wieder duch bis in der 2ten Spalte kein Wert mehr steht.



  • @hal9000

    danke für deine ausfürliche Hilfe! 🙂



  • @Unix-Tom

    Unix-Tom schrieb:

    @hal9000: Er weiß ja wie eine ListCtrl funktioniert...

    Kann ja nicht sein, sonst wäre ihm ja die Memberfunktion SetItemText(...) bekannt gewesen. 😉 Desweiteren ist aus der MSDN ersichtlich, dass die ein Item alle Spalteneinträge (subitems) beinhalted. Demnach können Spaltentexte nur über über das Item selbst angesprochen werden.

    Mach doch eine Schleife. Wenn GetItemCount erreicht dann beginne wieder von vorne.

    hilft nicht viel, wenn du nur den text der 2. Spalte in der 10. Zeile ändern willst.... 🤡


Anmelden zum Antworten