C#/MySQL Daten in TreeView anzeigen lassen?
Hallo, Ich habe ein kleines Problem auf welches ich gerade keine Lösung finde. Habe mich bereits durch einige Posts auf StackOverflow durchgeschlagen und einige Videos angeschaut aber nicht wirklich etwas gefunden was mir hilft.
Folgendes: Ich schreibe gerade eine Anwendung in C# welche Daten aus einer Datenbank holt und diese in einer TreeView anzeigt. Funktioniert soweit auch ganz gut.. wenn da nur nicht mehrere Einträge mit dem selben ParentNode wären....
Entweder liegt es an dem Datenbankmodell oder es ist tatsächlich bloß eine Sache von C# (was ich beim schreiben gerade eher denke).
Naja.. ich hänge mal ein Bild ran wo ich veranschaulicht habe was genau mein Problem ist:
Wie man sehen kann schreibt er die Module sowie die dazugehörigen Tests nicht mit unter den selben ParentNode, sondern erstellt dafür einen neuen Node mit selben Namen wie schon vorhanden.
Weiß irgendjemand wie ich das am besten lösen könnte, sodass er selbst wenn es mehrere Einträge in der Datenbank gibt mit selben ParentNode er nicht einen neuen Node erstellt sondern diese Daten einfach mit in den ersten bereits erstellten Node reinschreibt?
2 Antworten
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);
}
}
}
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!
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.
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: