I have a DataTable with id, parent, label columns and want to populate a TreeView with it.
I'm new to c# and as far as I understand, there is no ready solution for it, unlike some other languages.
So I sorted the data hierarchically at DataTable level and wrote not a very pretty recursive method.
Is this a good solution or can it be greatly improved?
using System.Data;
public void Populate()
{
//data example
var table = new DataTable();
DataColumn column;
DataRow row;
column = new DataColumn(); column.DataType = Type.GetType("System.Int32"); column.ColumnName = "id"; table.Columns.Add(column);
column = new DataColumn(); column.DataType = Type.GetType("System.Int32"); column.ColumnName = "parent"; table.Columns.Add(column);
column = new DataColumn(); column.DataType = Type.GetType("System.String"); column.ColumnName = "label"; table.Columns.Add(column);
row = table.NewRow(); row["id"] = 1; row["parent"] = DBNull.Value; row["label"] = "root1"; table.Rows.Add(row);
row = table.NewRow(); row["id"] = 2; row["parent"] = 1; row["label"] = "child11"; table.Rows.Add(row);
row = table.NewRow(); row["id"] = 3; row["parent"] = 1; row["label"] = "child12"; table.Rows.Add(row);
row = table.NewRow(); row["id"] = 4; row["parent"] = DBNull.Value; row["label"] = "root2"; table.Rows.Add(row);
row = table.NewRow(); row["id"] = 5; row["parent"] = 4; row["label"] = "child21"; table.Rows.Add(row);
row = table.NewRow(); row["id"] = 6; row["parent"] = 5; row["label"] = "child211"; table.Rows.Add(row);
// call method
int i = 0;
var result = new List<TreeNode>();
var data = table.Rows;
PopTree(ref data, DBNull.Value, ref i, ref result);
treeView1.Nodes.AddRange(result.ToArray());
}
private void PopTree(ref DataRowCollection data, object parent, ref int i, ref List<TreeNode> result)
{
if (i >= data.Count || data[i]["parent"].ToString() != parent.ToString())
{
return;
}
var row = data[i];
var children = new List<TreeNode>();
i++;
if (i < data.Count && row["id"].ToString() == data[i]["parent"].ToString())
{
PopTree(ref data, row["id"], ref i, ref children);
}
TreeNode node = new TreeNode(row["label"].ToString(), children.ToArray());
result.Add(node);
PopTree(ref data, parent, ref i, ref result);
}