Dialog mit Liste aktualisieren
-
Hallo Leute,
wie kann ich ein Dialog mit einer Liste beim Drücken eines Buttens wieder aktualisieren ??
In der Liste steht der Inhalt eines Vectors und dieser wird von einer Datenbank gefüllt.
Wenn ich den Butten drücke, schreibt er mir einen neuen eintrag in die Datenbank, dannach soll der Dialog wieder aktualisiert werden, weil dort der Vector wieder neu gefüllt wird.
Mit
void CServerDialog::OnNewserver() { UpdateData(TRUE); Datenbank.fInsertNewServer(); UpdateData(FALSE); }tut es nicht...
Gruß
andy_mann
-
Du musst
a) Das neue Element in den Vector eintragen,
b) das gleiche in der Datenbank tun,
c) das gleiche in der Listbox tun.Devil
-
Ja genau, das mache ich ja wenn ich den Dialog aufrufe.
Jetzt habe ich gedacht, dass ich einfach den Dialog neu aufrufe...
Gruß
andy_mann
-
Servus,
in welcher Funktion aktualisierst du denn die Daten bzw. in welcher schreibst du die Daten in deine Listbox?
OnInit? oder wo?
*winke*
Hellsgore
-
Hallo,
genauBOOL CServerDialog::OnInitDialog() { CDialog::OnInitDialog(); if(!m_cServerliste.SchreibeServerAusDatenbank()) { AfxMessageBox("Fehler beim init der Serverliste"); EndDialog(IDCANCEL); return TRUE; } CListBox* pLB = (CListBox*) GetDlgItem(IDC_LISTSERVER); for(int i= 0; i != m_cServerliste.size(); i++) { pLB->AddString(m_cServerliste[i].getServername().c_str()); } return TRUE; }Gruß
andy_mann
-
Mach doch ne neue Funktion. z.B.
Ich gehe mal davon aus das du den Vector schon gefüllt hast und auch die Datenbank geändert hast. Wenn der Vector dann so steht wie er sein soll schreibst du den einfach in die Listbox.
void CDeinDlg::InitValues() { CListBox* pLB = (CListBox*) GetDlgItem(IDC_LISTSERVER); pLB->ResetContent(); //Alles löschen und dann alles reinschreiben for(int i= 0; i != m_cServerliste.size(); i++) { pLB->AddString(m_cServerliste[i].getServername().c_str()); } }ist nur böse wenn du dann jedesmal 10000 Sätze oder so neuschreiben musst. Das dauert dann ein bissle....
Wenn du es natürlich ganz fein machen willst musst du dir merken, welchen Wert du geändert oder hinzugefügt hast und diesen dann in der Liste suchen bzw. hinzufügen und neu sortieren lassen. Ist dann ein bissle Aufwand

*winke*
Hellsgore
-
Danke Dir nochmals,
mmhhh, da komme ich jetzt aber nicht ganz mit.
Mein Gedanke ist,
Der Dialog wird aufgerufen:
BOOL CServerDialog::OnInitDialog()im Dialog wir die Funktion aufgerufen, die die Datenbank liest und in einen entsprechenden Vector schreibt:
if(!m_cServerliste.SchreibeServerAusDatenbank())Danach wird die Liste geschrieben in der der Inhalt des Vectors gezeigt wird:
CListBox* pLB = (CListBox*) GetDlgItem(IDC_LISTSERVER); for(int i= 0; i != m_cServerliste.size(); i++) { pLB->AddString(m_cServerliste[i].getServername().c_str()); }Jetzt habe ich im Dialog ein Button, der beim aufruf die Funktion aufruft in der ein Insert auf die Datenbank gemacht wird (neuen Server anlegen:
void CServerDialog::OnNewserver() { UpdateData(TRUE); Datenbank.fInsertNewServer(); UpdateData(FALSE); }Und jetzt möchte ich, dass wieder der Dialog neu gezeichnet wird , in dem die Liste wieder neu geschrieben wird.
Wie mache ich dass ??
Es handelt sich nur um ca. max. 10 Einträge...Gruß
andy_mann
-
Öhm hab dir doch einen Vorschlag gemacht!!!
Du erstellst dir eine neue Funktion, löschst alle Werte aus der Listbox und schreibst alle aus dem Vektor wieder rein, oder weisst du nicht so ganz wie man eine neue Funktion schreibt?*winke*
Hellsgore
-
devil81 schrieb:
Du musst
a) Das neue Element in den Vector eintragen,
b) das gleiche in der Datenbank tun,
c) das gleiche in der Listbox tun.Sollen wir es dir vorkauen ?
Und wenn es 10 Werte sind, für was brauchst du dann eine Datenbank ???Devil
-
Danke euch,
Jetzt Funktioniert es...
Gruß
andy_mann
-
Jetzt muß ich dennoch noch mal fragen,
ich führe für jeden Eintrag eine ID mit.
Wenn ich jetzt die elegante lösung nehmen möchte und nur den entsprechenden Eintrag ändern möchte, muß ich mir ja einen wert merken.
Wie mache ich dass.
Muß ich mir bei jedem Durchlauf zb. die ID des Servers in eine seperate Variable speichzern ??Gruß
andy_mann
-
Bsp. von mir wie man es lösen könnte:
CListBox* pList = (CListBox*) GetDlgItem(IDC_LISTSERVER); int iPos = 0; if ((iPos = pList->FindString("Dein neuer Satz")) != -1) { //Wenn was gefunden dann ändere den Satz pList->DeleteString(iPos); pList->InsertString(iPos, "Dein neuer Satz"); } else { //Wenn nix gefunden dann füge ein pList->AddString("Dein neuer Satz") }Dann wendest du das an, wenn du ein neuer Satz eingefügt wird oder ein neuer Satz hinzu gefügt werden soll. Das solltest du dann aber für deine Ansprüche umschreiben. Weiss auch nicht ob das funzt
einfach mal testen... Soll ja nur dazu dienen dir einen Hinweis zu geben.*winke*
Hellsgore
-
Hi!
Nutze statt der ListBox ein ListCtrl, dann kannst du die ID mittels SetItemData() speichern. Und das Auffinden per ID ist nach dem Sortieren auch einfach.

Gruß A.K.
-
Andreas Kapust schrieb:
Hi!
Nutze statt der ListBox ein ListCtrl, dann kannst du die ID mittels SetItemData() speichern. Und das Auffinden per ID ist nach dem Sortieren auch einfach.

Gruß A.K.
Wenn er nur eine Spalte hat, tuts ne Listbox auch.
Wenn du die elemente so wie sie im Vector stehen, in die Listbox schreibst,
sie dort nicht sortierst, dann sind die positionen der elemente in der Listbox
identisch mit dem Vector. Jetzt musst du nur noch rausfinden welches Element
in der Listbox selektiert wurde, dann kannst du es darüber im vector finden.Eleganter ist natürlich CListCtrl

Da könnte man noch checkboxen reinmachen, welches die Usability wohl vereinfachen würde...Devil
-
Vielen Dank für die vielen Ratschläge,
ich habe dies jetzt mit der CListBox realisiert und scheint auch zu funzen.
Wenn ich jetzt dennoch auf die CListCtrl umsteigen möchte, muß ich einfach aus der CListBox ein CListCtrl machen ??
Im MFC-Klassenassisten finde ich nichts darüber.
Gruß
andy_mann
-
Schau mal in die FAQ.

Oder suche nach CListCtrl.Es ist ein eigenes Steuerelement, findet sich aber auch
im Dialogeditor.Devil