ComboBox - Einträge zur Laufzeit hinzufügen
-
Hallo
Ich bin noch immer ziemlich unerfahren was Microsoft Visual C++ 6 angeht und oft scheiterts an den einfachsten Dingen wie z.B. folgendem Problem:
In meinem Dialog habe ich irgendwo eine ComboBox platziert. Nun möchte ich zur Laufzeit Einträge hinzufügen. Ich habe keine Ahnung wie das geht und bin auch den folgenden nicht-funktionierenden Code gekommen:
CComboBox cCat; cCat.Create(CBS_DROPDOWNLIST, CRect(20,20,200,200), this, IDC_COMBOBOX); cCat.AddString("Eintrag");
Der Quelltext wird natürlich ohne Probleme kompiliert und ausgeführt, doch die ComboBox bleibt leer, weil ich wohl irgendetwas (oder alles) falsch mache. z.B. verstehe ich nicht, warum ich Parameter 2 und 3 angeben muss bei der "Create"-Methode, ich will ja nichts an meiner bestehenden ComboBox verändern, sondern nur Einträge hinzufügen.
Kann mir jemand von euch Profis sagen wie es richtig gehen würde ?
-
Mit Create machst du eine neue Combobox, du brauchst entweder eine Membervariable (Control) oder GetDlgItem und einen Cast.
VC6 oder VC7? Bei 6 mach mal den Klassenassistenten auf und leg eine Controlvariable an. Das ist der einfachste und sauberste Weg.
Bei 7 geht das auch, aber frag bitte nicht wie genau.
-
Ich hab mir schon gedacht, dass die Methode wohl für was anderes war
Vielen Dank estartu_de, es geht ja doch um einiges einfacher als ich gedacht habe.
Nun funktioniert alles bestens.Übrigens verwende ich VC6, du hast also nochmals Glück gehabt
-
Warum einfach, wenns auch kompliziert geht?
-
Hallo da bin ich nochmals
Ich habe wieder so ein einfaches Problem, an dem ich bald seit 2 Stunden sitze...
Und zwar möchte ich nun den ausgewählten Eintrag aus der Combobox herauslesen anhand des Indexes. Die Einträge habe ich mit der Methode "AddString" hinzugefügt.
Der Index des ausgewählten Eintrages kann ja einfach ermittelt werden durch die Methode "GetCurSel". Mein Problem ist, dass ich noch immer keine Methode gefunden habe, um nun den String aus der Combobox herauszulesen... Ich habe zwar eine Methode gefunden namens "GetItemData", der man als Parameter den Index übergeben kann, doch ich kapiere nicht wofür die da ist bzw. wie ich mit der Methode den String herauslesen kann.Kann mir einer sagen wie den String aus dem ausgewählten Eintrag herauslesen kann ??? Danke
-
GetItemData müßtest du erstens vorher füllen und zweitens ist das nur eine Zahl.
Vielleicht würde es mit einem GetItemDataPtr gehen, weiß ich grade nicht.GetWindowText sollte gehen.
-
CComboBox::GetLBText
-
Vielen Dank
Ich weiss nicht, ich habe jetzt fast 2 Stunden versucht einen String herauszulesen aber diese Methode habe ich natürlich übersehen...
Was würde ich nur ohne euch tun
-
Wo hast du denn deine Strings? Wenn sie in ner DB stehen, dann kannst du folgendes machen:
////////////////////////////////////////////////////////////////// //läd Strings in die Combobox, die der Funktion übergeben wird void CMyRecordSet::loadCombo(CComboBox& Combo) { short index=0; CDBVariant varValue; MoveFirst(); Combo.ResetContent(); Requery(); while (!IsEOF()) { GetFieldValue( index, varValue ); //Merken, an welche Position es geschrieben wird (wegen evtl. Sortieren oder so) int nIdx = Combo.AddString(*(varValue.m_pstring)); Combo.SetItemData(nIdx,m_ID); // <- m_ID ist die ID des DB-Eintrags MoveNext(); } Combo.SetCurSel(0); }
lesen geht ähnlich schön, nimmst dir einfach die ID der current Selection und durchsuchst danach deine DB.
//ID der Current-Selection! int nID =0; nID = m_PCD_CMB.GetCurSel(); if (nID != -1) // es muss was gewählt sein { nID = m_PCD_CMB.GetItemData(nID); } if (!m_pSet->IDsuchen(nID))
und ID suchen macht dann noch
bool CMyRecordSet::IDsuchen(int nID) { CDBVariant varValue; short index = 2; if(IsOpen()) { MoveFirst(); while (!IsEOF()) { GetFieldValue( index, varValue ); if (m_ID == nID) {//wenn was gefunden return 1; } MoveNext(); } if (IsEOF()) { MoveFirst(); return 0; } } return 0; }
Kannst ja auch mit deinen eigenen Strings und so machen, musst halt anpassen
-
Man kann der ComboBox auch einfach ne Membervariable vom Typ String zuweisen, auch wenn es ein Dropdownfeld ist (wo der assi nur nen int zulässt).
Einfach in der Header int durch string ersetzen und dann klappts auch gleich beim UpdateData(true)
-
das kann ja jeder
ist ja langweilig!