Darstellung von Kategorien in TreeVIew



  • HI,

    ich habe eine DB, in der Kategorien drinstehen:

    ID_KATEGORIE, KATEGORIE, PARENT

    Wenn Parent = 0 ist, ist es eine Hauptkategorie, ansonsten eine Unterkategorie von Parent. Jetzt würde ich das gerne in einem TreeView darstellen:

    + Kategorie 1
    - Kategorie 2
       Unterkategorie
       Unterkategorie
       - Unterkategorie
            Subkategorie
    

    Gleich eine Frage dazu: Wenn ich das in einem TreeView darstelle, kann ich dann gleichzeitig rausfinden, welche ID_KATEGORIEN das gewählte Item hat? Gibt es da eine bessere Lösung?

    Codeschnipsel sind genauso willkommen 🙂

    DANKE!!

    strauberry



  • strauberry,

    strauberry schrieb:

    Gleich eine Frage dazu: Wenn ich das in einem TreeView darstelle, kann ich dann gleichzeitig rausfinden, welche ID_KATEGORIEN das gewählte Item hat? Gibt es da eine bessere Lösung?

    Besser als was? Gleichzeitig womit? Was hast Du denn schon programmiert?



  • Die Frage war so gemeint:

    Die Darstellung der Kategorien ist klar wie die laufen soll? Ok 🙂
    Diese Darstellung soll der Benutzer dazu verwenden, eine Kategorie auszuwählen. Die Auswahl soll dann in der DB gespeichert werden.

    Er klickt also auf eine Kategorie und irgendwo, in einem visible=false Feld z.B., wird die ID_KATEGORIEN gespeichert und von dort kann diese dann in die DB gespeichert werden. Nun die Frage: Wie komme ich an die zugehörige ID?? Ich möchte sowas wie in hmtl option value=XXX haben... so von der Denke her 🙂

    Jetzt ist es ja recht umständlich, diesen Baum zu generieren, die ID irgendwie (das war die zweite Frage) auszulesen usw. Daher die Frage: Geht das auch besser also so wie hier dargestellt...



  • Ich verstehe die Frage trotzdem nicht. Womit genau hast Du Probleme?
    Was hast Du denn schon an Code?



  • Bisher habe ich noch gar keinen Code 🙂

    Es sind eigentlich zwei Probleme:

    1. Wie kann ich die oben dargestellte Datenbank-Struktur in ein TreeView einlesen?

    ID_KATEGORIE, KATEGORIE, PARENT

    + Kategorie 1
    - Kategorie 2
       Unterkategorie
       Unterkategorie
       - Unterkategorie
            Subkategorie
    
    1. Wie kann ich hier dann ermitteln, welche ID_KATEGORIE das selektierte Item hat? Aus dieser Frage ergab sich die etwas unpassendere: Gibt es vielleicht einen besseren Weg als TreeView, um obige Darstellung umzusetzen...

    Danke!!!



  • TreeView ist schon die richtige Komponente. Ich würde innerhalb des TreeViews Objekte verwenden, die alle Daten aus einem DB-Eintrag enthalten. Also nicht nur den Namen (die Kategorie) verwenden. Dann hast Du alle Informationen die Du benötigst.



  • Wie komme ich zu solchen Objekten 🙂 ?

    Habe in der Hilfe nichts gefunden 😞



  • Eine eigene Klasse erstellen...

    Hab das hier gerade aus einer ähnlichen Anforderung kopiert (sezte ich ebenfalls als 'Node-Objekt' in einem TreeView ein):

    class clNode
    {
    private:
    	bool FDataChanged;
    	int FId;
    	int FOldId;
    	int FParentId;
    	int FOldParentId;
    	AnsiString FName;
    	AnsiString FOldName;
    	void __fastcall SetId(int value);
    	int __fastcall GetId();
    	void __fastcall SetParentId(int value);
    	int __fastcall GetParentId();
    	void __fastcall SetName(AnsiString value);
    	AnsiString __fastcall GetName();
    	void __fastcall SetDataChangedOverride(bool value);
    public:
    	__fastcall clNode();
    	__fastcall ~clNode();
    	__property bool DataChanged  = { read=FDataChanged };
    	__property bool DataChangedOverride  = { write=SetDataChangedOverride };
    	__property int Id  = { read=GetId, write=SetId };
    	__property int ParentId  = { read=GetParentId, write=SetParentId };
    	__property AnsiString Name  = { read=GetName, write=SetName };
    	bool __fastcall Save(void);
    	void __fastcall Restore(void);
    //	bool __fastcall Delete(void);
    };
    


  • Hi.
    Sowas in der Art habe ich in meinem Programm DBase verwendet. Kannst ja mal schauen, ob dir der Quelltext irgendwie hilft... 😉
    MfG Aoeke



  • strauberry,

    Joe_M. schrieb:

    Eine eigene Klasse erstellen...

    ... und die Instanzen dieser Klasse hängst Du dann an die Property TTreeNode::Data.



  • was genau heißt "hängen"?

    Hab in der Hilfe zwar paar Dinge zu Data gefunden, aber hat mir nicht wirklich Klarheit gebracht.

    Bitte auf ein kleines Beispiel, wie ich dann auf die Daten zugreife 🙂

    DANKE!!



  • äh, kurze Zwischenfrage: Was weisst Du über Klassen, Objektinstanzen, Zeiger und casten von Zeigern? Wenn Du diese Frage mit nichts oder fast nichts beantwortest, würde ich Dir erstmal ein Buch über die C++ Grundlagen empfehlen.



  • Ich weiß, was eine Klasse und was eine Objektinstanz ist. Was ein Zeiger ist, weiß ich auch 🙂

    In php kann ich das auch alles wunderbar einsetzen (außer Zeiger ;)) nur in C++ hapert es noch ein wenig mit der Syntax...

    Theoretisch weiß ich schon, was gemeint ist, nur wie der Code da konkret aussehen muss eben nicht.

    TreeView->Items[i]->Data = new Datenobjekt();
    TreeView->Items[i]->Data->Wert1 = String;
    TreeView->Items[i]->Data->Wert2 = Integer;

    Funktioniert es ungefähr so?

    Wenn nicht: Buchempfehlung 😃



  • nicht ganz 😉

    Data erwartet eine Zeiger vom Typ void*, deshalb solltest Du zuerst die Instanz erstellen (die ich dann auch direkt mit Werten füllen würde) und diesen Zeiger nach void* gecastet an Data übergeben.

    Bsp:

    TTreeNode* tnSelected = tvKategorien->Selected;
    TTreeNode* tnNew;
    clNode* clnSelected = (clNode*) tnSelected->Data;
    AnsiString asNewKat = InputBox("Neue Kat. unter: " + QuotedStr(clnSelected->Name), "Kategoriename:", "");
    if (!asNewKat.IsEmpty())
    {
    	clNode* clnNew = new clNode();
    	clnNew->ParentId = clnSelected->Id; 
    	clnNew->Name = asNewKat;
    	if (clnNew->Save())
    	{
    		tnNew = tvKategorien->Items->AddChildObject(tnSelected, clnNew->Name, (void*) clnNew);
    		tnSelected->AlphaSort(false);
    		if (!tnSelected->Expanded)
    			tnSelected->Expand(false);
    		tvKategorien->Selected = tnNew;
    	}
    	else
    	{
    		delete clnNew;
    	}
    

    clNode ist meine Datenklasse
    tvKategorien ist die TreeView
    tnSelected ist ein Zeiger auf den aktuell auswählten Node (TTreeNode*) des TreeView.
    tnNew ist der neu erzeugte TreeNode


Anmelden zum Antworten