C#/MySQL Daten in TreeView anzeigen lassen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
    using var conn = new MySqlConnection(" .... ");
    using var cmd = conn.CreateCommand();
    using var da = new MySqlDataAdapter(cmd);

    using var ds = new DataSet();

    // Die SQLs würde ich mit Feldnamen versehen
    da.SelectCommand.CommandText = "SELECT * FROM releaseversionen";
    da.Fill(ds, "Release");
    da.SelectCommand.CommandText = "SELECT * FROM module";
    da.Fill(ds, "Module");
    da.SelectCommand.CommandText = "SELECT * FROM testfaelle";
    da.Fill(ds, "Tests");

    // Schon etwas old-school, heute benutzt man eher ORMs wie z.B. Dapper
    using var dvRelease = new DataView(ds.Tables["Release"]);
    using var dvModule = new DataView(ds.Tables["Module"]);
    using var dvTests = new DataView(ds.Tables["Tests"]);

    for (int iRelease = 0; iRelease < dvRelease.Count; dvRelease++)
    {
        var nodeRelease = new TreeNode(dvRelease[iRelease]["releaseVersion"].ToString());
        treeView1.Nodes.Add(nodeRelease );
        dvModule.Filter = $"releaseID={dvRelease[iRelease]["releaseID"]}";


        for (int iModule = 0; iModule < dvModule.Count; iModule++)
        {
            var nodeModule =new TreeNode(dvModule[iModule]["modul"].ToString());
            nodeRelease.Nodes.Add(nodeModule);
            dvTests.Filter = $"modulID={dvRelease[iRelease]["modulID"]}";
            
            for (int iTests = 0; iTests < dvTests.Count; iTests++)
            {
                var nodeTest = new TreeNode(dvTests[iTests]["testfall"].ToString());
                nodeModule.Nodes.Add(nodeTest);
            }
        }
    }


Woher ich das weiß:Berufserfahrung – Senior-Softwaredeveloper mit 20 Jahren Berufserfahrung.
lostcsharp 
Fragesteller
 23.09.2021, 11:40

Oh. Mein. Gott.

Ich kann gar nicht ausdrücken wie dankbar ich dir gerade bin!

Vielen Vielen Dank!! Werde mir das jetzt erstmal in Ruhe anschauen damit ich seh wie das funktioniert.

Nochmals Vielen Dank!

0

Interessant wäre die Art und Weise, wie du

a) Diese Struktur in der DB abgebildet hast (ParentID / Child ID / FK ?)
b) Benutzt du einen ORM um die Daten zu laden (hast du Objekte mit Eigenschaften inkl. Beziehungen)?

Lass mal etwas Code sehen, damit man sich ein Bild machen kann wie du dein Ziel erreichen möchtest.

Woher ich das weiß:Berufserfahrung – Senior-Softwaredeveloper mit 20 Jahren Berufserfahrung.
lostcsharp 
Fragesteller
 23.09.2021, 10:44

Nach etwas rumprobieren habe ich nun es nun geschafft diese Daten richtig anzeigen zu lassen. Eine Sache gibt es dennoch wo ich nicht wirklich weiter kommen. Ich weiß nicht warum er Test3 und Test4 bei dem Node oben drüber mit anzeigt. (Ist im Bild untem zu sehen)

Erstmal zum Code um die Daten zu holen und anzeigen zu lassen:

if (_db.IsConnected())
{
    string releaseSQL =
        "SELECT * FROM releaseversionen";


    string modulSQL =
        "SELECT * FROM module";


    string testSQL =
        "SELECT * FROM testfaelle";


    MySqlCommand cmd = new MySqlCommand(releaseSQL, _db.Connection);
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);
    DataSet ds = new DataSet();


    da.Fill(ds, "Release");
    da.SelectCommand.CommandText = modulSQL;
    da.Fill(ds, "Module");
    da.SelectCommand.CommandText = testSQL;
    da.Fill(ds, "Tests");


    _db.Close();


    DataColumn parentCol = ds.Tables["Release"].Columns["releaseID"];
    DataColumn childCol = ds.Tables["Module"].Columns["releaseID"];


    DataColumn subParentCol = ds.Tables["Module"].Columns["modulID"];
    DataColumn subChildCol = ds.Tables["Tests"].Columns["modulID"];


    DataRelation relation = new DataRelation("ParChil", parentCol, childCol);
    DataRelation subRelation = new DataRelation("SubParChil", subParentCol, subChildCol);


    ds.Relations.Add(relation);
    ds.Relations.Add(subRelation);


    foreach(DataRow parent in ds.Tables["Release"].Rows)
    {
        TreeNode parentNode = treeView1.Nodes.Add(parent["releaseVersion"].ToString());
        foreach(DataRow child in parent.GetChildRows(relation))
        {
            parentNode.Nodes.Add(child["modul"].ToString());
            foreach (DataRow subChild in child.GetChildRows(subRelation))
            {
                for (int i = 0; i < parentNode.Nodes.Count; i++)
                {
                    parentNode.Nodes[i].Nodes.Add(subChild["testfall"].ToString());
                }
            }
        }
    }
}

Das Datenbankmodell sieht folgendermaßen aus:

Link zum Bild (kann in Antworten kein Bild einfügen)

So sieht auch die TreeView aus:

Link zum Bild weil bereits oben beschrieben

0