CTreeCtrl is not Root abfragen?
-
Wie kann man in einem Tree abfragen ob selectet Item kein Root ist, oder Rootitem selection deaktivieren ? Lassen sich Item ID´s zu einem SubItem abspeichern im Tree, nicht Sichtbar aber abfragbar?
Oder um mal das Prob zu schildern:
Root Items werden aus einer DB abgefragt und liegen als struct in einer std::list, ebenso die Sub Items in einer zweiten list welche im struct auch die ID des zugehörigen Root Items haben. Einige SubItems sind in verschiedenen Root Items.
Nach Auswahl eines Sub Items muß ich einer SP die ID des Root und des Subitems übergeben. Als Ergebnis habe ich eine Liste aus 2 NM Tabellen.
Meine bisherige Lösung ist nicht wirklich gut:
Zu Prüfen !::ItemHasChildren funktioniert nur wenn das Root schon Childs hat.
Das andere ist natürlich das ich bei einer Selection beide Strings mit beiden kompletten Listen vergleichen muß und prüfen muß zu welchem Sub Item das Root Item gehört.
Das ganze würde natürlich mit 2 Listen oder mit einer Drop Down + Liste gehen. Aber da ich das ganze in einem Docking Window habe inclusive der Ergebnissliste sowie einem kleinen RichEdit und Buttons wird das zu überladen.
Einer eine Idee`?
Vielen Dank im Voraus.
-
Hab die hälfte der Lösung schon gefunden:
if(m_TreeSuche.GetParentItem(tr)!=NULL){ CString rootstr= m_TreeSuche.GetItemText(tr); CString substr = m_TreeSuche.GetItemText(m_TreeSuche.GetParentItem(tr)); TRACE(rootstr); TRACE(substr);
Jetzt eist eigentlich nur noch die Frage ob ich ID´s neben dem String in das Tree setzten kann.
-
Benutz doch einfach SetItemData, da kannst du nen 32 bit Wert anhängen, oder halt einen Zeiger auf eine Strucktur ablegen, wo du dir merken kannst was du willst
-
Danke das klappt soweit mit der ID.
Wie geht das mit dem Pointer auf eine Strucktur?
-
ganz einfach Erzeug eine Strucktur mit new aud dem heap und trag den Zeiger ein
header:
strckt TreeData { int ID; DWORD was_du_willst; CString viel_Text; }
C-File
TreeData *Data = new TreeData; Data->ID = 1; Data->was_du_willst = 1000; Data->viel_Text = _T("Das ist mein Text"); m_TreeSuche.SetItemData(tr,Data);
Mal so schnell aus dem kopf, ob da jetzt noch fehler drin sind weiss ich nicht.
beim ende des Programms nicht vergessen die ganzen struckts wieder mit delete zu löschen. geht natürlich nur gut wenn du keine 64 bit zeiger hast
-
Supi Danke funktioniert.
setItemData(item, (DWORD)struct);
Sollte sich doch eigentlich auch auf CListView anwenden lassen? #
Muß ich mal probieren.CTreeCtrl::deleteAllItems();
scheint zu funktionieren,muß ich mal mit mehr als 3 testitems austesten.
-
CTreeCtrl::deleteAllItems() löscht dir alle Items in deinem tree, aber vergiss nicht zuvor die in Data abgelegten Struckturen zu löschen, sonst hast du da nen memoryleak weil der von CTreeCtrl::deleteAllItems() nicht freigegeben wird.