ساختار بانک اطلاعاتی رو به این صورت پیشنهاد می کنم .
NodeCode
NodeTitle
ParentNodeCode
خوب من خودم از این روش استفاده می کنم . یعنی هر گره باید بدون که زیر مجموعه کدوم گره قرار داره .
این هم کد برای پر کردن درخت :
this.treeViewStockClasses.Nodes.Clear();
System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandType = CommandType.Text;
sqlCommand.CommandText = "SELECT * FROM Nodes WHERE NodeCode <> 0";
System.Data.SqlClient.SqlDataAdapter SqlDataAdapter = new System.Data.SqlClient.SqlDataAdapter();
SqlDataAdapter.SelectCommand = sqlCommand;
this.DataTableNodes = new DataTable();
SqlDataAdapter.Fill(DataTableNodes);
this.treeViewStockClasses.BeginUpdate();
for (int i = 0; i < this.DataTableNodes.Rows.Count; i++)
{
if (this.DataTableNodes.Rows[i]["ParentNodeCode"].ToString() == "0")
{
this.treeViewStockClasses.Nodes.Add(this.DataTable Nodes.Rows[i]["NodeCode"].ToString(), this.DataTableNodes.Rows[i]["NodeTitle"].ToString());
this.AddNode(this.treeViewStockClasses.Nodes[this.treeViewStockClasses.Nodes.Count - 1]);
}
}
this.treeViewStockClasses.EndUpdate();
private void AddNode(System.Windows.Forms.TreeNode CurrentNode)
{
for (int i = 0; i < this.DataTableNodes.Rows.Count; i++)
{
if (this.DataTableNodes.Rows[i]["ParentNodeCode"].ToString() == CurrentNode.Name.ToString())
{
CurrentNode.Nodes.Add(this.DataTableNodes.Rows[i]["NodeCode"].ToString(), this.DataTableNodes.Rows[i]["NodeTitle"].ToString());
this.AddNode(CurrentNode.Nodes[CurrentNode.Nodes.Count - 1]);
}
}
}
البته این روش کاملاً ابتکاری هست و من خودم ایجادش کردم . شاید روش های بهتری هم باشه . البته الگوریتم یه الگوریتم بازگشتی ساده ست .