CListCtrl Mehrfachauswahl
-
Hallo ich ahbe ein Clistenfeld und möchte eine Mehrfachauswahl zulasssen. Dies geht nur mit gedrückter STRG Taste lässt sich das anders realisieren ?
-
Drück dich bitte mal klar und ohne Tippfehler aus.

Was hast du? CListBox oder CListCtrl?
Im Zweifelsfall musst du eine eigene Klasse ableiten.
-
Habe ein CListCtrl mit folgenden Header einstellungen :
m_akten.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_akten.SetExtendedStyle(m_akten.GetExtendedStyle()| LVS_EX_GRIDLINES |LVS_EX_CHECKBOXES );Wenn ich nun eine CheckBox auswähle also die Zeile ist nicht blau hinterlegt.
Das schlimme ist, das meine Fuktion alle Einträge überprüft ob sie ausgewählt sind dise mache ich mitfor (int i = 0; i <= m_akten.GetItemCount() ; i++)
{
if (m_akten.GetCheck(i) == true)
{
....Leider reagiert diese Funktion erst dann wenn ich einen Eintrag blau hinterlegt habe .
Kannst du mir helfen.
-
1.) Bitte benutze Code-Tags (den Knopf mit C/C++ drücken), sonst werde ich dazu übergehen, den Code-Teil deiner Postings zu ignorieren, was den Antworten sicherlich nicht förderlich sein wird.
2.) Zeig doch bitte mal die koplette Funktion, die nicht reagiert, in dem Schnipsel sehe ich kein Problem, da dort nicht mit Markierungen gearbeitet wird.
3.)Wenn ich nun eine CheckBox auswähle also die Zeile ist nicht blau hinterlegt.
Kannst du denn auf das Setzen des Häkchens reagieren? Dann markiere die Zeile dort nachträglich. (Ist nicht die feine Art, müsste aber gehen.)
-
for (int i = 0; i <= m_akten.GetItemCount() ; i++) { if (m_akten.GetCheck(i) == true) { CString sql_befehl = "add_bestellung '"+ m_akten.GetItemText(i,0) + "','" + nutzer +"','"+datum+"'"; TRY { db.ExecuteSQL(sql_befehl); AfxMessageBox("Die Akten sind angefordert "); } CATCH (CDBException, ex) { TRACE("\n%s\n",ex->m_strError); AfxMessageBox("Akte konnte nicht angelegt werden "); } END_CATCH m_akten.DeleteItem(i); }Das ist meine Funktion : sie liest aus einer tabelle (Clist Ctrl ) bestimmte werte aus die in einer datenbank verarbeitet werden das ist aber völlig uninteressant.
Danach lösche ich die markierten eintrage wieder damit der nutzer nicht doppelt einträge selektieren kann
-
Okay, das interessanteste hast du leider nicht mitkopiert.

Wie heißt die Funktion? Ist das eine OnBtn...?Ich sehe leider noch nicht, wozu da die Markierung interessant ist, du arbeitest doch mit den Häkchen.

-
Okay hier die ganze Funktion

void CAkte_bestellenDlg::OnButton1() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen _SYSTEMTIME zeit; GetLocalTime(&zeit); CString datum; datum.Empty(); datum.Format("%i.%i.%i %i:%i:%i",zeit.wDay,zeit.wMonth,zeit.wYear,zeit.wHour,zeit.wMinute,zeit.wSecond); if (m_akten.GetSelectedCount() > 0) { CDatabase db; db.Open("Winkav"); for (int i = 0; i <= m_akten.GetItemCount() ; i++) { if (m_akten.GetCheck(i) == true) { CString sql_befehl = "add_bestellung '"+ m_akten.GetItemText(i,0) + "','" + nutzer +"','"+datum+"'"; TRY { db.ExecuteSQL(sql_befehl); AfxMessageBox("Die Akten sind angefordert "); } CATCH (CDBException, ex) { TRACE("\n%s\n",ex->m_strError); AfxMessageBox("Akte konnte nicht angelegt werden "); } END_CATCH m_akten.DeleteItem(i); } } db.Close(); } }Brauch die Markierung um den wert der ersten Spalte auszulesen
mach ich hiermit :m_akten.GetItemText(i,0)
-
Nein, die Markierung brauchst du weder für GetItemText noch für GetItemCount oder GetCheck.
Eigentlich sollten die blauen Balken für die Häkchen völlig egal sein.
Ich weiß leider nicht, was da Nebenwirkungen zeigt und kanns auch gerade nicht ausprobieren. Vielleicht schaffe ich es morgen, aber ich will es nicht versprechen.
-
Ist möglich aber warum ist der "Status" nicht markiert wenn ich durch die schleife gehe und einen haken gestzt habe aber keine zeile markiert habe.
das verstehe ich nicht oder gebit es vielleicht noch eine andere möglichkeit den status des items abzufragen.Danke
-
Bin morgen auch erst wieder da mach jetzt schluss bis morgen
-
Soweit ich weiss müsste es so sein wie Estartu bereits geschrieben hat. Aber mal was anderes ... müsste es in der for-Schleife nicht '<' statt '<=' heissen? So wanderst du doch sicherlich einen Schritt zu weit?
-
Mr.Yellow schrieb:
Soweit ich weiss müsste es so sein wie Estartu bereits geschrieben hat. Aber mal was anderes ... müsste es in der for-Schleife nicht '<' statt '<=' heissen? So wanderst du doch sicherlich einen Schritt zu weit?
Oh ja, du hast Recht!
-
Danke für den Tipp werde es gleich mal probierern
-
Okay jetzt stimmt die schleife aber das problem ist immer noch vorhanden .
Ganz komisch :
ich wähle mehrere Einträge aus aber keine zeile ist markeirt, wähle sie über die checkbox aus. wenn ich nun eine zeile markiere, dann entfernt er auch alle anderen markierten einträge.
-
Setz bitte mal Breakpoints auf ALLE Zeilen, in denen m_akten vorkommt.
Dann starte das Programm mit F5 im Debugmodus und mach das nochmal, was du hier beschrieben hast:ich wähle mehrere Einträge aus aber keine zeile ist markeirt, wähle sie über die checkbox aus. wenn ich nun eine zeile markiere, dann entfernt er auch alle anderen markierten einträge.
Schau dir jede Zeile, wo er anhält an, ob die an dem Phänomen schuld sein könnte.
Weiterlaufen lässt du das Programm mit F5 wenn es angehalten wurde.
Du kannst auch in meinen Artikel über das Debuggen (im Artikelforum) gucken, der erklärt noch mehr.
-
Okay das war eine gute Idee:
das problem war die abfrageif (m_akten.GetSelectedCount() > 0)wenn ich sie heraus nehme dann geht es gut. aber ich wollte gerne wissen ob überhaupt einträge selektiert sind
-
basti_1984 schrieb:
Okay das war eine gute Idee:
das problem war die abfrageif (m_akten.GetSelectedCount() > 0)wenn ich sie heraus nehme dann geht es gut. aber ich wollte gerne wissen ob überhaupt einträge selektiert sind
Und dann wunderst du dich, wenn es nur geht, wenn etwas gewählt ist? Du hast es doch selbst "gefordert".
Da musst du dich wohl entscheiden.
Zur Not erklär mal, was genau du erreichen willst:
1.) Fällt dir beim Schreiben oft selbst schon ein Denkfehler auf (geht mir oft so: Post fertig - Fehler gelöst)
2.) Fällt vielleicht hier wem was ein.
-
Eigentlich wollte ich verhindern das unsinnige datenbank einträge entstehen aber das geht ja so auch ganz gut danke noch mal

-
Basti_1984,
du mischst hier zwei Dinge: das Ankreuzen und das Markieren.
Das Ankreuzen markiert nicht automatisch.Du musst dich wohl für eins entscheiden.
Ankreuzen + GetCheck abfragen
Oder über Strg+Anklicken markieren + GetSelekted abfragenTester2