ListView Elemente



  • Ich habe eine ListView mit drei Spalten!
    Ich hatte das Problem, dass neu hinzugekommene Elemente immer an erster Stelle hinzugefügt wurden!
    Danach habe ich hier im Forum gefunden, dass ich beim ListViewItem 0xFFFFF angeben muss!(LvItem.iItem=0xFFFFF)!
    Das funktioniert auch ganz super jedoch besteht das Problem, dass es nur bei der ersten Spalte funktioniert...weiß jemand warum??Wäre sehr dankbar wenn wenn mir jemand helfen würde/könnte!



  • Weiß das keiner?



  • Dir ist schon klar, dass du immer erst ein neues Listenitem hinzufügen musst, damit du dann ein Item in die dazu gehörigen Spalten schreiben kannst.

    +--------+--------+--------+--------+
    |Column 1|Column 2|Column 3|Column 4|
    +--------+--------+--------+--------+
    |Item 0  | Item 1 |        |        |
    |Item 0  |        | Item 2 |        |
    |Item 0  |        |        | Item 3 |
    | ...                               |
    +--------+--------+--------+--------+
    

    Es muss also immer das erste Item hinzugefügt werden.

    Gruß Tobi.



  • Mach ich ja eh... Hier der Code:

    LvItem.mask=LVIF_TEXT;   
    
    				LvItem.cchTextMax = 256; /
    
    				LvItem.iItem=0x7FFF;         
    				LvItem.iSubItem=0;       
    
    				LvItem.pszText=songTitel; 
    
    				SendMessage(hList,LVM_INSERTITEM,0,(LPARAM)&LvItem); // Send info to the Listview
    
    				LvItem.iItem=0x7FFF;
    
    				LvItem.iSubItem=1;
    
    				LvItem.pszText="Test1";
    
    				SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem);
    				LvItem.iItem=0x7FFF;
    
    				LvItem.iSubItem=2;
    
    				LvItem.pszText="Test";
    

    funktioniert aber nicht!
    Die erste Spalte klappt prima, die anderen zwei nciht!

    MFG





  • Hmm irgendwie finde ich nicht die Antwort auf meine Frage



  • Ich glaube das mit dem 0x7FFF ist Quatsch. Füg doch einfach ein Item für die Zeile hinzu (ist dann in der ersten Spalte) und dann die Subitems für die Spalte. Wenn in der Zeile der Eintrag für die erste Spalte leer sein soll, setz 'nen leeren Text "".



  • Der erste Eintrag soll nicht leer sein!Die Einträge die neu hinzukommen sollen einfach an der nächstfolgenden Stelle angezeigt werden!
    Also:
    1Eintrag 1 Position
    2Eintrag 2 Position
    3Eintrag 3 Position

    und nciht das der neu hinzugekommene Eintrag auf die erste Position wandert



  • const char* item_names[3] = { "Item1", "Item2", "Item3" };
    
    LvItem.mask = LVIF_TEXT;
    LvItem.iSubItem=0;
    for ( int i=0; i<3; i++ )
    {
        LvItem.iItem = i;
        LvItem.pszText = item_names[i];
        ListView_InsertItem( hList, &LvItem );
    }
    

    bzw:

    void ListView_AddItem( HWND hList, LV_ITEM* item )
    {
        item->iItem = ListView_GetItemCount( hList );
        ListView_InsertItem( hList, item );
    }
    


  • Das habe ich mir auhc schon überlegt aber bei 100 Einträge ist das eine Mühsame Geshichte..gibt es da keine andere Möglichkeit??
    Und was hat das mit dem 0x7FFF an sich??Wieso funktioniert das nur bei der ersten Spalte??



  • Fragender01 schrieb:

    Das habe ich mir auhc schon überlegt aber bei 100 Einträge ist das eine Mühsame Geshichte..gibt es da keine andere Möglichkeit??

    Wo bitte ist das denn bitte mühsam?

    void ListView_AddItem( HWND hList, LV_ITEM* item )
    {
        item->iItem = ListView_GetItemCount( hList );
        ListView_InsertItem( hList, item );
    }
    

    Oder meinetwegen auch:

    void ListView_AddItems( HWND hList, const std::vector<std::string>& entries )
    {
        assert( Header_GetItemCount(ListView_GetHeader(hList)) == entries.size() );
        LVITEM LvItem;
        LvItem.mask = LVIF_TEXT;
        LvItem.iItem = ListView_GetItemCount( hList );
        for ( int i=0; i<entries.size(); i++ )
        {
            LvItem.iSubItem = i;
            LvItem.pszText = entries[i];
            ListView_InsertItem( hList, &LvItem );
        }
    }
    

    Fragender01 schrieb:

    Und was hat das mit dem 0x7FFF an sich??Wieso funktioniert das nur bei der ersten Spalte??

    Keine Ahnung, davon hab ich auch noch nie was gehört.



  • Ich programmiere in C..
    Wäre sehr Hilfreich wenn du den Code auch für C hättest..
    Danke



  • Naja, statt std::vectorstd::string nimmst du halt const char** als Zeichenketten-Array und noch eine int-Variable o.ä. um die Anzahl der Strings darzustellen.



  • Er schreit das er das assert nciht kennt..



  • Okey habe es jetzt geschafft!
    Thx



  • Fragender01 schrieb:

    Das habe ich mir auhc schon überlegt aber bei 100 Einträge ist das eine Mühsame Geshichte..gibt es da keine andere Möglichkeit??
    Und was hat das mit dem 0x7FFF an sich??Wieso funktioniert das nur bei der ersten Spalte??

    0x7FFF macht nur bei LVM_INSERTITEM wirklich Sinn, weil es die Einfügeposition angibt. Ist die Einfügeposition kleiner als die Anzahl der Elemente, dann wird an dieser Position angefügt, ansonsten am Ende der Liste. 0x7FFF erspart einem die Ermittlung der aktuellen Elementanzahl, was bei vielen einzufügenden Elementen natürlich auch wertvolle Zeit kostet. Solange man weniger als 32767 Elemente einfügt, kann man getrost 0x7FFF verwenden.

    LVM_SETITEM erfordert allerdings die genaue Position des jeweiligen Eintrags, hier ist 0x7FFF völlig fehl am Platz. Deshalb funktioniert das Setzen der Texte für die einzelnen Spalten auch nicht.


Anmelden zum Antworten