Problem beim einsortieren von items in ein ListView...



  • hi ich habe mir hier mal ein listview erstellt:

    HWND DoCreateListView( HWND hParent, HWND hLview ) {
    
        RECT rParent;
        LVCOLUMN lvc;
        LVITEM lvi;
    
            GetClientRect( hParent, &rParent );
    
        InitCommonControls();
    
        hLview = CreateWindowEx( WS_EX_WINDOWEDGE, WC_LISTVIEW, "",
                                WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS,
                                0, 0, rParent.right, rParent.bottom, hParent,
                                (HMENU)ID_LVIEW, 0, 0 );
    
        // set the mask of LV
        lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    
        lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
        lvi.state = 0;
        lvi.stateMask = 0;
    
        //add columns
        for( int i = 0; i < 5; i++ ) {
    
            lvc.iSubItem = i;
            lvc.pszText = "TestColumn";
            lvc.cx = 120;
            lvc.fmt = LVCFMT_CENTER;
            ListView_InsertColumn( hLview, i, &lvc );
    
            for( int i = 0; i < 20; i++ ) {
    
                lvi.iItem = i;
                lvi.iImage = i;
                lvi.iSubItem = 0;
                lvi.pszText = "test";
                ListView_InsertItem( hLview, &lvi );
            }
        }
    
        return( hLview );
    }
    

    und frage mich gerade wie ich je 20 mal test in jede spalte reinschreiben lasse.... was fehlt in meinen coe noch? hat es was mit der LVN_NOTIFY zu tun?, wenn ja diese hab ich noch nicht in angriff genommen.

    Gruß Tobi!


  • Mod

    T0bi schrieb:

    und frage mich gerade wie ich je 20 mal test in jede spalte reinschreiben lasse.... was fehlt in meinen coe noch? hat es was mit der LVN_NOTIFY zu tun?, wenn ja diese hab ich noch nicht in angriff genommen.

    //add columns
        for( int i = 0; i < 5; i++ ) {
    
            lvc.iSubItem = i;
            lvc.pszText = "TestColumn";
            lvc.cx = 120;
            lvc.fmt = LVCFMT_CENTER;
            ListView_InsertColumn( hLview, i, &lvc );
        }
        for( int i = 0; i < 20; i++ ) {
            lvi.mask = LVIF_TEXT;
            lvi.iItem = i;
            lvi.iSubItem = 0;
            lvi.pszText = "test";
            ListView_InsertItem( hLview, &lvi );
            for (int j=1; j<5; ++j) {
                 lvi.iSubItem = 1;
                 ListView_SetItem( hLview, &lvi);
            }
        }
    
        return( hLview );
    }
    

    mask wurdevergessen zu setzen. Du kannst image nicht setzten wenn Du keine Imagelist definiert hast!



  • also irgendwie klappt das so nicht es wird immer noch alles in die erste spalte geschrieben...

    PS.: ist lvi.iSubItem ist der wert der hier zugewiesen wird immer 1 oder 0? also ist das hier nen flag??

    Gruß Tobi.


  • Mod

    Nein Subitem 0 ist die erste Spalte. Subitem 1 die zweite etc.



  • hmm aber trotzdem shcreibt er nichts in die spalten... was muss ich noch aendern?



  • ok.. schon gut geht doch alles 🙂
    nur noch die frage wie mach ich das das ich die HeadControls oben fest machen kann also das man die spalten nicht von der breite her aendern kann.


  • Mod



  • @link ich find da irgendwie nicht 😞

    und noch ne frage... wie kommt es das ich nur fuer die erste spalte ListView_Insert benutzen kann und fuer weitere funktioniert nur ListView_SetItem, wieso ?

    Gruß Tobi



  • hast du SubItem auch verändert?

    Mfg Ominion

    EDIT: sry, war blöd^^

    Du musst erstmal ein Item erstellen, und dann kannst du erst die Items verändern.



  • hm ok und wie muesste ich den quelltext dann veraendern, das mir das prog einträge zeilen weise macht?

    also zB. hab ich hier eine struct Test: mit char name[128]; int alter; };

    so nun leg ich mir 50 objecte an und belege sie mit zufalls werten
    Test test[ 50 ];
    test[ 0 ].name = "Knut"; test[ 0 ].alter = 12;
    test[ 1 ].name = "Ingo"; test[ 1 ].alter = 18;
    test[ 2 ].name = "Irre"; test[ 2 ].alter = 13;
    ...

    jetz habe ich hier mein LV

    #NUM. | Name | Alter
    ----------------->>> erster eintrag vertig, gehe naechste zeile.
    |
    V

    for( int zeile = 0; zeile < 50; zeile++ ) {

    lvi.iItem = zeile;
    lvi.SubItem = 0;
    lvi.pszText = // sprintf( szBuffer, "%i", zeile )
    ListView_InsertItem( hLview, &lvi );

    lvi.SubItem = 1;
    lvi.pszText = test[ i ].name;
    ListView_SetItem( hLview, &lvi );

    lvi.SubItem = 2;
    lvi.pszText = sprintf( szBuffer, "%i", test[ i ].alter )
    ListView_SetItem( hLview, &lvi );

    }

    is das so irgendwie richtig???


  • Mod

    T0bi schrieb:

    @link ich find da irgendwie nicht 😞

    und noch ne frage... wie kommt es das ich nur fuer die erste spalte ListView_Insert benutzen kann und fuer weitere funktioniert nur ListView_SetItem, wieso ?

    Gruß Tobi

    Die Technik ist dort drin beschrieben:
    Locking Column Headers!



  • und @mein Beispiel.. ist der so gebrauchbar oder schlecht geschrieben?


  • Mod

    Dein Beispiel ist Quark. sprintf returniert doch kleinen Speicher sondern eine Anzahl von Zeichen!

    Ansonsten stimmt es.

    Still es Dir so vor: InterItem erzeugt eine neue Zeile mit leeren Subitems.
    Mit Setitem setzt Du die Daten.



  • mit sprintf() will ich doch nur den int in nen char konvertieren.
    und wie mach ich das wenn ich nen item ankilcke das er mir die ganze zeile makiert?

    Gruß Tobi.


Anmelden zum Antworten