In diesem vierten Datenbank-Tutorial zeige ich, wie man mit Visual C++ und MFC (Microsoft Foundation Classes) eine hierarchische Darstellung von Datenbankinhalten in einem TreeControl erstellt. Um diese Anleitung nicht zu lang werden zu lassen, schreibe ich immer nur die Dinge auf, die verändert werden müssen. Bei Codeabschnitten werden die Teile, die von mir verändert wurden, fett geschrieben.


CRecordView auswählen

CTreeCtrl für den Zugriff auf das TreeControl benötigt.
OnInitialUpdate()-Methode, die beim Start des Programms aufgerufen wird:
void CDb4View::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_db4Set;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CString zwsp;
// Sicherstellen, dass die Datenbank geöffnet ist
if (!m_pSet->IsOpen())
m_pSet->Open();
// Sortieren der Tabelle nach "BestellteEinheiten"
// m_strSort enthält den Teil der SQL-Klausel, der nach ORDER BY kommt
m_pSet->m_strSort = "[BestellteEinheiten]";
// Neu laden des CRecordSet, um die Sortierung zu aktivieren
m_pSet->Requery();
// Variable für das Attribut "BestellteEinheiten" des letzten Datensatzes
int oldanzahl = -1;
// Variable für das TreeControl-Item, unter dem Untereinträge angehängt werden
HTREEITEM parent;
// Alle Datensätze der Tabelle durchlaufen
while (!m_pSet->IsEOF())
{
// Nur wenn dieser Parent (Bestellte Einheiten) in der TreeControl
// noch nicht existiert...
if (oldanzahl != m_pSet->m_BestellteEinheiten)
{
// Neue "Bestellte Einheiten" merken
oldanzahl = m_pSet->m_BestellteEinheiten;
// Wert in String umwandeln
zwsp.Format("%d", m_pSet->m_BestellteEinheiten);
// Als neuer Parent-Knoten in die TreeControl einfügen
parent = m_tree.InsertItem(zwsp);
}
// Artikelname als Child-Element unter dem aktuellen Parent einfügen
m_tree.InsertItem(m_pSet->m_Artikelname, parent);
// Zum nächsten Datensatz springen
m_pSet->MoveNext();
}
// Diese Einfügemethode funktioniert nur, weil die Datensätze
// vorher nach "BestellteEinheiten" sortiert wurden
}
Schlüsselkonzepte im Code:
m_strSort - CRecordSet-Member für SQL ORDER BY-KlauselnRequery() - Lädt das RecordSet mit aktiver Sortierung neuHTREEITEM - Handle für TreeControl-Elemente in MFCInsertItem() - Fügt Elemente in das TreeControl ein
Erweiterungsmöglichkeiten:
- Mehrere Hierarchieebenen (z.B. Kategorie → Bestellmenge → Artikel)
- Icons für verschiedene Elementtypen im TreeControl
- Drag & Drop-Funktionalität für TreeControl-Elemente
- Kontextmenüs für TreeControl-Elemente
- Ein-/Ausklappen aller Ebenen mit einem Klick