برای ذخیره نودها یک جدول کافیه و حتی کار رو آسون تر هم میکنه ، چون هر نود میانی همزمان هم parent و هم child هست. در صورتی که اگر دو جدول داشته باشید برای اینگونه گره ها مجبورید اطلاعات اون گره رو در هر دو جدول ذخیره کنید.
در ثانی شما با این دو جدول چه طور سطح اول رو تشخیص میدید؟! اگر قرار بر این باشه که سطح اول رو با Parentid برابر 0 در نظر بگیرید دیگه نیازی به جدول اول نیست. اگر هم جدول اول فقط برای سطح اول باشه سطوح بعدی رو مجبورید در جدول دوم ذخیره کنید که باز هم میشه سطح اول رو به جدول دوم اضافه کرد.
پس همونطور که دوستان هم گفتند با یک جدول باید کار کنید.
جدولی به صورت زیر :
id -> int
text -> nvarchar(max)
parentID -> int
برای نودهای سطح اول ParentID را null قرار بدید.
جهت لود گره ها ، اطلاعات جدول را براساس ParentID به صورت صعودی مرتب کرده و براساس ParentID نودها رو اضافه کنید:
private void LoadNodes()
{
treeView1.Nodes.Clear();
cmd = new SqlCommand("SELECT ID,Text,ParentID from tblNodes ORDER BY ParentID", con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (Convert.ToString(dr["ParentID"]) == string.Empty)
{
treeView1.Nodes.Add(new TreeNode() { Name = Convert.ToString(dr["ID"]), Text = Convert.ToString(dr["text"]) });
}
else
{
TreeNode[] tn = treeView1.Nodes.Find(Convert.ToString(dr["ParentID"]), true);
if (tn[0] != null)
{
tn[0].Nodes.Add(new TreeNode() { Name = Convert.ToString(dr["ID"]), Text = Convert.ToString(dr["text"]) });
}
}
}
dr.Dispose();
con.Close();
}
id را در خصوصیت name مربوط به treenode ذخیره کنید تا براساس همین مشخصه بتونید گره رو find کنید.
برای اضافه کردن گره جدید ، در گره پدر(اینجا گره select شده) مشخصه name همان Parentid خواهد بود:
private void AddNode(TreeNode parentNode , string newChildText)
{
int parentId = int.Parse(parentNode.Name);
cmd = new SqlCommand("Insert into tblNodes(text,parentid) values(@text,@parentid)", con);
cmd.Parameters.AddWithValue("@text", newChildText);
cmd.Parameters.AddWithValue("@parentid", parentId);
con.Open();
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT ID from tblNodes WHERE text=@text AND parentID=@Parentid";
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
TreeNode tnNewChild = new TreeNode() { Name = Convert.ToString(dr["ID"]), Text = newChildText };
treeView1.Nodes.Find(parentId.ToString(), true)[0].Nodes.Add(tnNewChild);
dr.Dispose();
con.Close();
}
به اینصورت استفاده کنید:
TreeNode tnSelected = treeView1.SelectedNode;
if (tnSelected != null)
{
AddNode(tnSelected, textBox1.Text);
}