CTreeView Updaten
-
Hallo LEute,
wie kann ich denn ein CTreeView updaten.
Ich ändere in einem Dialog ein paar Daten, ween ich nun Speichere sage, soll sich der Baum mit aktualisieren.Gruß
andy_mann
-
Hat keiner eine Idee ??
Gruß
andy_mann
-
GetTreeCtrl( )
fortsetzung folgt in der msdn unter dem stichpunkt "CTreeCtrl" - members.
-
Ich Danke DIr,
Diese Baum struktur habe ich schon, ich bin mir nur nicht sicher, wie die Aktuallisierung dieses Baumes machen soll.
Beim Start des Programmes werden Daten aus einer Datenbank geholt und teilweise als Baumstruktur dargestellt.Wenn ich jetzt Daten aus der Datenbank aktuallisere oder entferne, sollte sich die Baumstruktur mitaktualisieren.
Ich dachte, ich lasse einfach die Baumstruktur neu zeichen..
aber wie ??Gruß
andy_mann
-
du "aktualisierst" die daten im tree entweder auf die gleiche oder auf eine ähnliche weise.
die gleiche weise: alles löschen und mit einem neuen datensatz füllen.
allerdings ist diese art und weise nicht sehr schön.besser wäre: du hast zwei listen. eine mit den einträgen, die dazukommen und eine, die entfernt werden. das entfernen wäre dann wohl ein leichtes. mit den members, die du ja bereits schon gesehen hast, kannst du eine suchfunktion erstellen.
schwieriger wird es mit dem einfügen. da musst du dir erst ein mal überlegen wie die eingefügt werden sollen. alphabetisch? im subtree? ...?
probiers, und poste dann deinen code, falls du nicht weiterkommst.
-
Ich Danke DIr,
hier mal was ich bislang hin gebracht habe:
void CNaviView::TreeViewUpdate(std::string u_strName) { std::string m_strWort; HTREEITEM m_Liste_2; for(int i = 0; i != GetTreeCtrl().GetCount() ; i++) { m_Liste_2 = GetTreeCtrl().GetNextItem(TVI_ROOT, TVGN_CARET); m_strWort = GetTreeCtrl().GetItemText(m_Liste_2); if(m_strWort == u_strName) { GetTreeCtrl().DeleteItem(m_Liste_2); GetTreeCtrl().InsertItem(u_strName.c_str(), 16, 16, m_Liste_2); } } GetTreeCtrl().SortChildren(m_Liste_2); }Ich bekomme es jetzt aber nicht hin, dass er mir die einzelenen Items Durchsucht und mir den Namen ausspuckt.
GetNextItem(TVI_ROOT, TVGN_CARET); springt er immer an die erste stelle.Gruß
andy_mann
-
erklär doch mal, was du in der schleife machen willst, da blicke ich nicht so schnell durch.
hier ein codeschnippsel um den tree zu durchsuchen:
HTREEITEM hCurrent = pCtrl->GetNextItem(TVI_ROOT, TVGN_NEXT); //zum anfang while (hCurrent != NULL) //solange nicht ende erreicht { // Get the text for the item. Notice we use TVIF_TEXT because // we want to retrieve only the text, but also specify TVIF_HANDLE // because we're getting the item by its handle. TVITEM item; TCHAR szText[1024]; item.hItem = hCurrent; item.mask = TVIF_TEXT | TVIF_HANDLE; item.pszText = szText; item.cchTextMax = 1024; BOOL bWorked = pCtrl->GetItem(&item); hCurrent = pCtrl->GetNextItem(hCurrent, TVGN_NEXT); //versuche nächstes // If we successfuly retrieved an item, and the item's text // contains a lowercase letter 'e', delete the item. if (bWorked && _tcschr(item.pszText, 'e')) pCtrl->DeleteItem(item.hItem); }solche schönen sachen sind übrigens in der msdn library zu finden.
-
Vielen Dank für den Code,
also ich wollte in einem Dialog den Servername ändern, löschen usw.
Dort übergebe ich den alten Namen an die CNaviView und dort möchte ich nach dem Namen im Tree suchen, wenn gefunden, dann löschen und an dieser stelle wieder eintragen.
Gruß
andy_mann
-
denke kommst damit etwas weiter.
benachrichtige dann mal, wenn etwas nicht klappt, aber auch wenn du fertig wirst.
-
Ich habe schon ein problem mit pCtrl.
ICh bekomme den Pointer nicht her....CTreeCtrl* pCtrl;GRuß
andy_mann
-
...na den hast du doch schon!
GetTreeCtrl()
-
Danke schön,
jetzt läuft er zwar Durch, ich komme aber nicht in die Unter Ordner...
Dort müsste ich nähmlich den ITEM ändern..void CNaviView::TreeViewUpdate(std::string u_strName) { std::string m_strWort; HTREEITEM hCurrent = GetTreeCtrl().GetNextItem(TVI_ROOT, LVNI_ALL); //zum anfang while (hCurrent != NULL) //solange nicht ende erreicht { m_strWort = GetTreeCtrl().GetItemText(hCurrent); if(m_strWort == u_strName) { GetTreeCtrl().DeleteItem(hCurrent); GetTreeCtrl().InsertItem(u_strName.c_str(), 16, 16, hCurrent); } hCurrent = GetTreeCtrl().GetNextItem(hCurrent, TVGN_NEXT); //versuche nächstes } }Gruß
andy_mann
-
falls du mit nur zwei ebenen arbeitest reicht dir auch eine schleife in der schleife, die dann den subtree abfragt. gleiches prinzip wie eben schon.
bei mehr als 2 ebenen empfehle ich dir eine rekursive funktion zu erstellen.
hier ein codeschnippsel zum abtippen:
[msdn]if (pmyTreeCtrl->ItemHasChildren(hmyItem)) { HTREEITEM hItem = pmyTreeCtrl->GetChildItem(hmyItem); while (hItem != NULL) { pmyTreeCtrl->SetItemState(hItem, TVIS_BOLD, TVIS_BOLD); hItem = pmyTreeCtrl->GetNextSiblingItem(hItem); } }[/msdn]
-
Hallo,
vielen vielen Dank, jetzt läuft das Ding Durch.
Nur noch entsprechenden Suchbefehl dann tut dass.
Ich Poste es mal wenn ich es soweit habe...Ist aber ganz schön Kompliziert mit CTreeView.
Dachte das geht einfacher..Gruß
andy_mann
-
kenne da schrierigere fälle. das ist doch eine sache von 5-10 minuten. einfach die msdn durchsuchen. aber richtig!
-
In der msdn habe ich nachgesehen, aber anscheinend nicht richtig.....
Gruß
andy_mann