tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
1107
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Hi!
    Ich habe in meinem Programm eine List Control in Report-Ansicht.
    Das hinzufügen von Spalten und Items funktioniert Prima.

    Problem 1:
    Aber wenn ich alle Spalten Löschen will, bleiben immer welche übrig.
    Hier der relevante Code:
    Code :
    1
    2
    3
    4
    5
    
        CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
        int nColCount = pHC->GetItemCount();
        for (int i=0; i< nColCount; i++)
            m_Messr_List.DeleteColumn(i);
        m_Messr_List.InsertColumn(colum,"Messreihe",LVCFMT_LEFT,100);

    Problem 2:
    Wie kann ich die List Control so konfigurieren, dass beim Markieren eines Items die ganze Zeile markiert wird?

    Problem 3:
    Wie kann ich das letzte Element markieren und automatisch dort hin scrollen?

    Danke
    Geändert von PinkoPalino (20.07.07 um 13:28 Uhr)
     

  2. #2
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Hallo,

    1. Du löschst die Spalten von vorn. Dadurch verschiebt sich bei jedem Mal der Spalten-Index. Irgendwann übersteigt dann i die Anzahl der noch vorhandenen Spalten. Du mußt die Spalten von hinten beginnend löschen.
    Code :
    1
    2
    
    for (i=ColumnCount-1;i>=0;i--)
        m_Messr_List.DeleteColumn(i);
    Allerdings bin ich mir nicht sicher, ob du wirklich die Spalten löschen willst. Denn in deinem Quelltext besorgst du dir die Anzahl der Items.

    2.
    Code :
    1
    
    m_Messr_List.SetExtendedStyle(LVS_EX_FULLROWSELECT);
    3.
    Code :
    1
    
    m_Messr_List.SetSelectionMark(m_Messr_List.GetItemCount());
    Nicht ganz sicher bin ich mir, ob die markierte Zeile automatisch angezeigt wird.

    Mfg

    langer
    Geändert von langer1801 (20.07.07 um 16:06 Uhr)
     

  3. #3
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Laut diesem Beitrag:
    http://www.tutorials.de/forum/visual...ermitteln.html
    wird mit
    Code :
    1
    2
    
        CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
        int nColCount = pHC->GetItemCount();
    die Anzahl der Spalten ermittelt.

    Das mit
    Code :
    1
    
    m_Messr_List.SetSelectionMark(m_Messr_List.GetItemCount());
    Habe ich bereits versucht (man muss bei GetItemCount noch -1 machen, damit letztes).
    Aber es wird in der Liste nicht angezeigt, dass das Letzte markiert wurde und auch nicht automatisch dort hin gescrollt. Aber das Item wird im Hintergrund ausgewählt.
    gibt es irgendwie eine Möglichkeit, das markierte Item anzuzeigen?

    Danke trozdem. Den anderen Code kann ich erst am Montag ausprobieren.
     

  4. #4
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Hallo,

    da hast du recht mit dem Header-Control.

    Und für das Selektieren geht vielleicht besser
    Code :
    1
    
    SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);

    Mfg

    langer
     

  5. #5
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Also jetzt habe ich mal alles getestet:
    Die Spalten muss man wie folgt löschen, da sich, wie langer1801 bereits erwähnte, die Spaltennnummer immer wieder nach vorne schiebt:
    Code :
    1
    2
    3
    4
    
        CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
        int nColCount = pHC->GetItemCount();
        for (int i=0; i< nColCount; i++)
            m_Messr_List.DeleteColumn(0);

    Die gesamte Zeile wird jetzt beim Klicken auch markiert.

    Aber das letzte Problem funktioniert leider noch nicht.
    Mit dem Code
    Code :
    1
    
    SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);
    hat sich eigentlich nichts geändert.
    Ich habe folgendes geschrieben:
    Code :
    1
    2
    3
    
        int nIndex = m_Messr_List.GetItemCount()-2;
        m_Messr_List.SetSelectionMark(nIndex);
        m_Messr_List.SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);

    Aber leider wird die Auswahl nicht angezeigt.

    Zusätzlich habe ich noch folgende Fragen:
    4. Wenn man mehrere Elemente ausgewählt hat, wie bekommt man deren Indexe?

    5. Wenn ich z.B: zwei ListConrtol auf meinem Formular habe, beim ersten etwas auswähle und dann beim zweiten klicke, wird die Markierung beim ersten gelöscht?! Warum. Kann man das irgendwie abstellen?

    6. Welches Ereignis muss ich bei der ListConrtol auswählen, wenn ich auch darauf reagieren will, wenn der User mit den Pfeiltasten die Markierung ändert. Momentan funktionierts nur beim Klicken (Ich habe NM_CLICK ausgewählt)

    Danke
    Geändert von PinkoPalino (23.07.07 um 10:21 Uhr)
     

  6. #6
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Hallo,

    habe was für deine 4-Frage

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
        CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_PROPERTY_LIST);
     
        UINT i, uSelectedCount = pmyListCtrl->GetSelectedCount();
        int  nItem = -1;
        CString str;
     
        // Update all of the selected items.
        if (uSelectedCount > 0)
        {
            for (i=0; i < uSelectedCount; i++)
            {
                nItem = pmyListCtrl->GetNextItem(nItem, LVNI_SELECTED);
                ASSERT(nItem != -1);
     
                //tu irgendwas mit dem Item 
            }
        }
     

  7. #7
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    6. Welches Ereignis muss ich bei der ListConrtol auswählen, wenn ich auch darauf reagieren will, wenn der User mit den Pfeiltasten die Markierung ändert. Momentan funktionierts nur beim Klicken (Ich habe NM_CLICK ausgewählt)

    Würde ich "LVN_ITEMCHANGED" nehmen,
    dabei muss aber berücksichtigt werden, dass das Ereignis auch unter anderem
    beim Einfügen der Items ausgelöst wird
     

  8. #8
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    5. Wenn ich z.B: zwei ListConrtol auf meinem Formular habe, beim ersten etwas auswähle und dann beim zweiten klicke, wird die Markierung beim ersten gelöscht?! Warum. Kann man das irgendwie abstellen?
    mit
    pCtrl->SetExtendedStyle(..)
    kannst du dein ListCtrl stylen.

    Schau dir in der Online-Hilfe
    LVS_EX_TRACKSELECT an
     

  9. #9
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Hi titanic
    Ich habe jetzt das für das 6. Problem versucht. Das müsste Funktionieren.

    Zum 5. Problem habe ich auch versucht. Aber wenn ich pCtrl->SetExtendedStyle(LVS_EX_TRACKSELECT) verwende, funktioniert das FullRowSelect nicht mehr (es wird beim Klicken keine Markierung angezeigt), oder kann man zwei solche Styles kombinieren?
    Weiters habe ich nachgesehen, was TrackSelect überhaupt macht. Hier der Text aus der Online-Hilfe:
    LVS_EX_TRACKSELECT
    Version 4.70. Enables hot-track selection in a list-view control. Hot track selection means that an item is automatically selected when the cursor remains over the item for a certain period of time. The delay can be changed from the default system setting with a LVM_SETHOVERTIME message. This style applies to all styles of list-view control. You can check whether hot-track selection is enabled by calling SystemParametersInfo.
    Soweit ich das verstehe, wird damit nur ein Item autom. ausgewählt, wenn man sich länger darüber mit dem Mauszeiger befindet, oder löst das mein Problem 5?

    Das zu Problem 4 muss ich erst noch einbauen, aber das dürfte eigentlich funktionieren.

    Danke
     

  10. #10
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Hi,
    Zum 5. Problem habe ich auch versucht. Aber wenn ich pCtrl->SetExtendedStyle(LVS_EX_TRACKSELECT) verwende, funktioniert das FullRowSelect nicht mehr (es wird beim Klicken keine Markierung angezeigt), oder kann man zwei solche Styles kombinieren?
    Ja und zwar so:

    pCtrl->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
    LVS_EX_TRACKSELECT );

    Gruß
    titanic
     

  11. #11
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Durch diese Style änderung wird aber nur das Item autom. markiert.
    Das eigentliche Problem ist aber, dass wenn die ListControl den Fokus verliert, geht die Markierung auch verloren.
    Es sollte aber das Item Markiert bleiben.
     

  12. #12
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Um das Item zu markieren verwende
    Code :
    1
    
    m_MyListCtrl.SetItemState(nItem,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

    und um die Markierung zu erhalten
    Code :
    1
    
    m_MyListCtrl.ModifyStyle(0,LVS_SHOWSELALWAYS);

    Mfg

    langer
     

  13. #13
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Und um zu Scrollen, kannst du folgenden Code verwenden:
    Code :
    1
    2
    3
    4
    5
    6
    
    CSize size;
    CRect rect;
    m_MyListCtrl.GetItemRect(0,&rect,LVIR_BOUNDS);   //ItemHöhe bestimmen
    size.cx=0;
    size.cy=rect.Height()*m_ctrListe.GetItemCount();       //oder statt GetCount ItemPosition angeben
    m_ctrListe.Scroll(size);

    Anmerkung: Das funktioniert, um zum Ende zu Scrollen. Genau genommen muß man aber die Anzahl der Zeilen bestimmen, um die gescrollt werden soll und size.cy mit der Itemhöhe * AnzahlZeilen füllen.

    Mfg

    langer
    Geändert von langer1801 (24.07.07 um 15:59 Uhr)
     

  14. #14
    PinkoPalino PinkoPalino ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    @titanic && langer 1801
    Danke!
    Jetzt sind alle Probleme gelöst.

    Grüße
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 03.12.08, 17:19
  2. List Control
    Von shader09 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 29.11.07, 11:08
  3. List Control
    Von shader09 im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 23.10.07, 13:16
  4. List Control Steuerelement
    Von bukem im Forum VisualStudio & MFC
    Antworten: 14
    Letzter Beitrag: 21.06.07, 15:43
  5. ACL ( Access Control List) auslesen
    Von kasmen im Forum Java
    Antworten: 2
    Letzter Beitrag: 02.08.05, 09:14