private TreeView treeViewTest = new TreeView();
private void Form1_Load(object sender, EventArgs e)
{
this.Controls.Add(treeViewTest);
treeViewTest.Bounds = new Rectangle(655, 400, 340, 282);
string[] nodesNameInTree = { "Anti Virus>Padvish,Avast,Bitdefender", "Internet Tools>Browser>Google Chrom,Opera,Mozila FireFox,Apple Safari", "Anti Virus", "Internet Tools>Downloader>Internet Download Manager", "Internet Tools>Browser>Comodo Dragon" };
AddNodeInTree(treeViewTest, nodesNameInTree);
}
/// <summary>
/// رشته هایی رو به عنوان گره یا نود میگیره و به شی درخت اضافه میکنه
/// </summary>
/// <param name="treeViewName"></param>
/// نام درخت
/// <param name="allNodes"></param>
/// آرایه ها (یا آرایه بصورت پارامز) با فرمت خاص (فرمت تعریف شده در بالا) دریافت و به درخت اضافه میکنه
private void AddNodeInTree(TreeView treeViewName, params string[] allNodes)
{
foreach (string nodeNames in allNodes) //هر رشته ی ورودی (اعضای آرایه) که بصورت درخت با پیمایش عمقی طراحی شد رو حساب میکنه
{
if (nodeNames.Contains('>')) //اگه رشته ، دارای فرزند و نوادگان بودند ، اینجا اجرا میشه
{
TreeNode[] treeNodesParents; //اطلاعات تری نود های والدین ، در این آرایه ذخیره میشه
string[] nodeParents; //اطلاعات نام های والدین در این آرایه ذخیره میشه
string[] nodeChilds; // اطلاعات نام آخرین (آخرین دسته از نوادگان) یا ریشه ی آخر ، در این آرایه ذخیره میشه
// این بلاک فقط برای پر کردن 2 آرایه ی رشته ای بالا بکار میره تا بعد از بلاک ، از رم پاک بشن و نام اضافی برای متغییرها اشغال نشه
{
ArrayList nodeParentsTemp = new ArrayList();
string[] nodeParentsTempNum2 = nodeNames.Split('>');
string[] nodeChildsTempNum2 = nodeNames.Split(',');
nodeParentsTemp.AddRange(nodeParentsTempNum2);
nodeParentsTemp.RemoveAt(nodeParentsTemp.Count - 1);
nodeParents = new string[nodeParentsTemp.Count];
treeNodesParents = new TreeNode[nodeParentsTemp.Count];
nodeParentsTemp.CopyTo(nodeParents);
nodeChildsTempNum2[0] = nodeChildsTempNum2[0].Remove(0, nodeChildsTempNum2[0].LastIndexOf('>') + 1 );
nodeChilds = new string[nodeChildsTempNum2.Length];
nodeChildsTempNum2.CopyTo(nodeChilds, 0);
}
// در این حلقه ، فقط اعضای آرایه nodeParents رو اضافه میکنه به عنوان والدین و همینطور آرایه ی treeNodesParents رو پر و مقداردهی میکنه که اطلاعات نودهاست . البته در صورتی که نودهای هر گره ، قبلا وجود نداشته باشن
for (int index = 0; index < nodeParents.Length; index++)
{
if (index==0) //اگه قسمت ریشه ی اصلی بود ، به ریشه ی اصلی اضافه میکنه و اطلاعات نودها رو توی عضو قبلی آرایه treeNodesParents میریزه
{
TreeNode searchedNode = SearchNodeInTree(nodeParents[index], treeViewName);
if (searchedNode == null)
treeNodesParents[index] = treeViewName.Nodes.Add(nodeParents[index]);
else
treeNodesParents[index] = searchedNode;
}
else //وگرنه بقیه ی والدین ها را به زیر مجموعه ی ریشه ی اصلی اضافه میکنه و اطلاعات نودها رو توی عضو قبلی آرایه treeNodesParents میریزه
{
TreeNode searchedNode = SearchNodeInTree(nodeParents[index], treeViewName, treeNodesParents[index - 1]);
if (searchedNode == null)
treeNodesParents[index] = treeNodesParents[index - 1].Nodes.Add(nodeParents[index]);
else
treeNodesParents[index] = searchedNode;
}
}
// این حلقه آرایه ی nodeChilds که نام های بچه هاست رو در صورتی که در گره ی آخرین والد وجود نداشته باشه ، اضافه میکنه
for (int index = 0; index < nodeChilds.Length; index++)
{
TreeNode searchedNode = SearchNodeInTree(nodeChilds[index], treeViewName, treeNodesParents[treeNodesParents.Length - 1]);
if (searchedNode == null)
treeNodesParents[treeNodesParents.Length - 1].Nodes.Add(nodeChilds[index]);
}
}
else //اگه رشته دارای فرزند یا نوادگان نبودند و فقط بصورت تکی (برای ریشه ی اصلی) درخت بودند ، اینجا اجرا و به همین ریشه ی اصلی درخت اضافه میکنه
{
TreeNode searchedNode = SearchNodeInTree(nodeNames, treeViewName);
if (searchedNode == null)
{
treeViewName.Nodes.Add(nodeNames);
}
}
}
}
/// <summary>
/// چک میکنه اگه نام رشته ای به عنوان گره و نود (تری نود) ای قبلا وجود داشته باشه (فقط در اون تری نود یا گره ی خاص) ، همون تری نود رو برمیگردونه وگرنه نال یا خالی رو برمیگردونه
/// </summary>
/// <param name="nodeName"></param>
/// رشته ای به عنوان نام گره ای که میخوایم جستجو کنیم
/// <param name="treeViewName"></param>
/// نام درخت ای که میخوایم توش جستجو کنیم
/// <param name="treeNode"></param>
/// تری نود یا اطلاعات گره ای که میخوایم توش جستجو کنیم . اگه این پارامتر نال (که بصورت پیش فرض نال یا همون خالی هست) ، جستجو در ریشه ی اصلی شی درخت انجام میشه
/// <returns></returns>
private TreeNode SearchNodeInTree(string nodeName, TreeView treeViewName, TreeNode treeNode = null)
{
if (treeNode == null) // اگه اطلاعات نود نال یا خالی باشه ، در ریشه ی اصلی شروع به جستجو میکنه
{
foreach (TreeNode node in treeViewName.Nodes) // تمام نودهایی که در ریشه ی اصلی هست رو میگیره و نام دونه دونه ی اون نودها رو چک میکنه ببینه برابر اون رشته ی داده شده هست یا نه
{
if (node.Text == nodeName)
return node;
}
}
else // وگرنه جستجو رو داخل نود ای که بهش داده شده انجام میده و نام دونه دونه ی اون نودها رو چک میکنه ببینه برابر اون رشته ی داده شده هست یا نه
{
foreach (TreeNode node in treeNode.Nodes)
{
if (node.Text == nodeName)
return node;
}
}
return null;
}