Treeview mit Werten aus Datenbank



  • Hallo Leutz,

    ich komme mit dem Treeview Steuerelement nicht klar ... und zwar möchte ich das mit Werten aus einer Datenbank füllen.

    Ich habe eine Access Tabelle namens Event. Dort drinn ist das Jahr, das Ereignis, Beschreibung usw. gespeichert.

    Ich möchte mir eine Übersicht verschaffen und in einem Treeview die Jahre anzeigen lassen. Als Unterpunkt sollen die Ereignisse des Jahres aufgelistet werden.

    Meine Tabelle sieht zb. so aus:

    ID Jahr Ereignis Beschreibung Verein usw.
    ----------------------------------------------------
    1 2000 Bikertreffen Nürburgring Testverein
    2 2000 Bikerparty ............................
    3 2000 AusfahrtX .............................
    4 2001 Bikertreffen .............................

    usw.

    Im Treeview Steuerelement will ich mir nur die Jahre als Hauptknoten anzeigen lassen:

    zb.

    +2000
    +2001
    +2002
    +2003
    +2004

    Wenn man dann auf das jahr 2000 klickt, wollte ich einfach nur die Ereignisse dieses Jahres auflisten

    zb.

    -2000
    |__Bikertreffen
    |__Bikerparty
    |__AusfahrtX

    Ich bekomme das zwar hin, dass alle Jahre ordentlich aufgelistet werden, aber die Ereignisse des Jahres werden nicht zugeordnet sondern alle in den ersten Knoten geschrieben.

    vector <AnsiString> Ereignis;
    vector <int> Jahr;
    
    dbzugriff->ADOQuery1->Close();
    dbzugriff->ADOQuery1->SQL->Clear();
    dbzugriff->ADOQuery1->SQL->Add("SELECT distinct Jahr FROM Eventtable Where Verein ='"+cmbVereinauswahl->Text+"'");
    dbzugriff->ADOQuery1->Open();
    for(int i=0; i<dbzugriff->ADOQuery1->RecordCount; i++)
    {
    
     Jahr.push_back(dbzugriff->ADOQuery1->FieldByName("Jahr")->AsInteger);
     dbzugriff->ADOQuery1->Next();
    
    }
    
    // Treeview füllen
    
    for(unsigned int j=0; j<Jahr.size();j++)
    {
     TreeView1->Items->Add(NULL,Jahr[j]);
    
    }
    

    Ich weiß nicht wie ich es anstellen soll, dass die Ereignisse dem jeweiligen Jahresknoten untergeordnet werden.

    Treeview1->Items->Addchild(Treeview1->Items->Item[j], "Ereignisse des Jahres...");
    

    Es wäre super wenn mir jemand helfen könnte.
    Danke,
    Sven



  • Hi,
    ich weiss nicht was bei dir nicht geht, aber dies hier funzt.

    TreeView1->Items->Add(NULL,"2004");
    TreeView1->Items->Add(NULL,"2005");
    TreeView1->Items->Add(NULL,"2006");
    
    TreeView1->Items->AddChild(TreeView1->Items->Item[1], "Ereignisse des Jahres...");
    

    Ich hoffe es hilft Dir weiter, denn ich sehe eigendlich keinen Unterschied ;-().
    wenn du zwischen deinen Zeilen oben auf eine andere EBENE wechselst kann es sein, das das von dier beschriebene passiert.

    gehst du irgendwie wieder in den ROOT zurueck vor

    Treeview1->Items->Addchild(Treeview1->Items->Item[j], "Ereignisse des Jahres...");
    

    ??



  • st37,

    st37 schrieb:

    Ich weiß nicht wie ich es anstellen soll, dass die Ereignisse dem jeweiligen Jahresknoten untergeordnet werden.

    Treeview1->Items->Addchild(Treeview1->Items->Item[j], "Ereignisse des Jahres...");
    

    ein paar Anregungen: Rufe alle relevanten Daten mit einer Abfrage ab und füge diese in einem Durchlauf in die TreeView ein. Ich kenne Deine Tabellenstruktur nicht, aber so ungefähr stelle ich mir das vor:

    SELECT * FROM Eventtable WHERE ... ORDER BY Jahr
    

    TTreeNodes::Add liefert Dir das erzeugte TTreeNode-Objekt zurück. Benutze dieses, statt über einen Index zuzugreifen:

    TTreeNode* node = TreeView1->Items->Add(NULL, jahr);
    //über alle Datensätze des Jahres iterieren und ...
        node->AddChild(node, eventBeschreibung);
    


  • Zuerst mal eine Frage: Wird es bei diesen zwei Ebenen bleiben, oder wird eine noch tiefere Verschachtelung angestrebt? Wenn ja, ist der DB-Ansatz schon schwierig zu handhaben... Aber falls dem so ist, hab' ich ein paar Anregungen für Dich.

    Ansonsten: Die Jahreszahlen hast Du ja offensichtlich schon hinbekommen. Du mußt jetzt nur noch eine Schleife duch alle vorhandenen TTreeNodes machen, die Jahreszahl aus dem ->Text holen, und eine Abfrage auf die Datenbank für diese Jahreszahl machen. Alle Ergebenisse fügst Du mit dem aktuellen TTreeNode als Parent mit AddChild ein.

    So die grobe Schleife wäre:

    TTreeNode* ttn = TreeView1->Items->GetFirstNode();
    int jahr;
    while (ttn)
    {
      jahr = ttn->Text.ToInt();
      // hier DB-Abfrageschleife: jeweils alle Ereignisse eines Jahres suchen
          // in der Schleife
          AnsiString Ereignis = dbzugriff->ADOQuery2->FieldByName("Ereignis")->AsString;
          TreeView1->Items->AddChild(ttn, Ereignis);
          ADOQuery2->Next();
      ttn = ttn->getNextSibling();
    };
    


  • Hi Leute,

    erstmal vielen Dank für die Antworten, echt super!!

    @Joe_M

    es bleibt bei 2 Ebenen, ich wollte mir dann die restlichen Daten des Datensatzes in einem Listview ausgeben lassen (zwecks Übersichtlichkeit).

    Ich werde jetzt versuchen die geposteten Ansätze praktisch umzusetzen 🙄

    Also vielen Dank nochmal.

    grüße
    Sven


Anmelden zum Antworten