mehrere Comboboxen



  • Hi ihr,

    ich schreibe hier grad an einem Programm das schlussendlich ein Speichern für Word Dokumente ermöglichen soll.

    Bislang scheitere ich aber daran 4 Comboboxen (alles Drop Down Listen) miteinander zu verbinden.

    Und das sieht so aus:

    Combobox 1

    Combobox 2 (basierend auf den Wert den Combobox 1 annimmt)

    Combobox 3 (basierend auf die Werte von CB1 und CB2)

    Combobox 4 (basierend auf die Werte der vorherigen 3 CB)

    Combobox 1 wird nun selber im Programm befüllt (in der Dialog-Funktion). Combobox 2 wird anhand von einer Funktion befüllt die als Übergabewerte den HWND des Dialogs und CB_GETCURSEL-Wert der ersten Combobox besitzt. Anhand von diesen beiden Werten wird dann anhand von if(){}else if(){}else if... (switch.. case geht irgendwie nicht) ermittelt, was für Werte nun hierrein geschrieben werden müssen (da CB2 ja von CB1 abhängt) und diese dann auch dort verwendet zum befüllen.

    So weit, so gut.

    CB1 und CB2 sind befüllt. Mein Problem ist aber nun. Es funktioniert, wenn ich CB1 ändere, dass dann auch CB2 sich ändert. Allerdings lässt sich nun aus CB2 kein Wert herauspicken. Das heisst, egal was ich in dieser Combobox anklicke, es erscheint kein Wert. Es wird wieder auf ein leeres Feld zurückgesetzt trotz der Tatsache, dass da mehrere Optionen zur Auswahl stehen, wenn man den "Drop Down Pfeil" betätigt.

    Woran kann dieses nun hängen? Darf man vielleicht kein CBN_SELCHANGE zur Überprüfung eben jener Felder benutzen oder ist dieses vollkommen ligitim zu so einer Überprüfung?

    MfG Kimiyou


  • Mod

    In der Theorie und sogar in der Praxis geht das... 🕶
    Wie gehst Du denn vor? Etwas code zu sehen wäre sinnvoll.



  • switch(HIWORD(wParam)){
                   case CBN_SELCHANGE:
                     // Erste Liste prüfen
                     LRESULT cbItem = SendDlgItemMessage(hDlg, IDC_LIST, CB_GETCURSEL, 0, 0);
                     cb1(hDlg, cbItem);
    
                     // Zweite Liste prüfen
                     LRESULT cbItem2 = SendDlgItemMessage(hDlg, IDC_LIST2, CB_GETCURSEL, 0, 0);
                     if(cbItem2 == 0 && cbItem == 0){
    ...
    

    Den Restcode hab ich erst mal ausgeschlossen, da er zum Einem noch in einer Funktion untergebaut werden soll und zum Anderem nicht besonders schön aussieht. Ähnlich werde ich nun beim Posten der Funktion cb1 verfahren. Es wird nur ein kleiner Teil ersichtlich sein.

    void cb1(HWND hDlg, LRESULT cbItem){
      if(cbItem == 0){ // Falls Cat 1
        // Bisherigen Index löschen
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_RESETCONTENT, 0, 0);
        //Neuen Index hinein schreiben
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 0, (LPARAM) (LPCTSTR) ddlStr10);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 1, (LPARAM) (LPCTSTR) ddlStr11);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 2, (LPARAM) (LPCTSTR) ddlStr12);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 3, (LPARAM) (LPCTSTR) ddlStr13);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 4, (LPARAM) (LPCTSTR) ddlStr14); 
      }
      else if(cbItem == 1){ // Falls Cat 2
        // Bisherigen Index löschen
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_RESETCONTENT, 0, 0);
        //Neuen Index hinein schreiben
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 0, (LPARAM) (LPCTSTR) ddlStr20);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 1, (LPARAM) (LPCTSTR) ddlStr21);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 2, (LPARAM) (LPCTSTR) ddlStr22);
        SendDlgItemMessage (hDlg, IDC_LIST2, CB_INSERTSTRING, 3, (LPARAM) (LPCTSTR) ddlStr23);
      }
      else if(cbItem == 2){ // Falls Cat 3
    ...
    

  • Mod

    Aber ohne einen CB_SETSEL hast Du natürlich keine Selektion, sondern die Combobox erscheint leer.



  • Vielen, vielen Dank!

    Das scheint echt der Fehler gewesen zu sein. Manchmal hat man echt nen Brett vorm Kopf

    MfG Kimiyou



  • Ok, wie gesagt. Das Problem mit der Auswahl hat sich gelöst. Jedenfalls teilweise.

    Nun kommt es aber zu folgendem Problem:

    1. CB wird immer richtig ausgewählt
    2. CB wird dementsprechend richtig ausgegeben mit dem CB_SETCURSEL auf den Eintrag 0
    3. CB wird nach der 2. CB ausgerichtet, wenn man in dieser eine Auswahl tätigt mit CB_SETCURSEL auf den Eintrag 0.
    4. CB erscheint sofort mit der Abhängigkeit von der 3. CB und dem CB_SETCURSEL auf Eintrag 0

    Dabei tritt allerdings nun das Problem auf, dass man zwar in der 2. CB eine Auswahl tätigen kann und diese dann auch in der 3. CB sichtbar ist, aber nicht in der 2. CB selbst. Das heisst die 2. CB bleibt, egal was ich mache, auf Eintrag 0 stehen. Wenn ich dann in der 3. CB eine Auswahl machen will springt er auf die Auswahlliste um, die eigentlich nach der Auswahl der 2. CB (Eintrag 0) erscheinen müsste.

    Das heisst im Endeffekt kann ich nur 0.0.0.0 wählen oder 1.0.0.0 usw. (CB1.CB2.CB3.CB4). Ein 0.1.1.0 ist z B völlig unmöglich.

    Nun frage ich euch. Woran könnte eben jenes Problem liegen?

    Falls ich noch einen Part des Programms posten soll, sagt bescheid. Im Grunde wurde aber schon alles gepostet, was wichtig ist in den oberen Beiträgen


Anmelden zum Antworten