PDA

View Full Version : مبتدی: سوال درباره Treeview - نحوه پیمایش نود های treeiew



irana8
دوشنبه 17 شهریور 1393, 13:01 عصر
با سلام
من برنامه ای دارم که توی لیست ویو چند تا node دارم و بعضی از node ها خودشون child node دارن .واسه همه node ها و child node ها هم به tag شون یک مقداری اختصاص دادم.حالا میخام همه node ها child node هایی که انتخاب میشن مقدار tagشون را برام برگردونه اما موفق به اینکار نمیشم.ممنوم میشم راهنمایی کنید.

fakhravari
دوشنبه 17 شهریور 1393, 15:02 عصر
string Adress = treeView1.SelectedNode.Tag.ToString();

irana8
دوشنبه 17 شهریور 1393, 18:49 عصر
با سلام و تشکر
این کد رو در رویداد after check می نویسم اما فقط مقدار نود اول را بر میگردونه.برای اینکه درست عمل کنه اول باید برم رو اون نود کلیک کنم بعد چک باکسشو انتخاب کنم.ایا راهی برای حل این مشکل وجود داره؟
ممنون

fakhravari
دوشنبه 17 شهریور 1393, 21:33 عصر
treeView1_AfterSelect

irana8
سه شنبه 18 شهریور 1393, 07:29 صبح
با تشکر از شما دوست عزیز اینا رو خودم می دونم .من نمی خوام نود ها رو select کنم.واسه همین تو رویداد after check می نویسم.من نیازم اینه که وقتی چک باکس هر نود چک میشه مقدار tag شو همون لحظه نشون بده.حالا اگه این نمیشه.در آخر چطور می تونم مقدار همه نود هایی که چک شدن را برگردونم؟من از این کد استفاده می کنم اما درست جواب نمیده
foreach (TreeNode node in e.Node.Nodes)
MessageBox.Show(node.Tag.ToString());

fakhravari
سه شنبه 18 شهریور 1393, 10:37 صبح
private void button1_Click(object sender, EventArgs e) {
for (int a = 0; a < treeView1.Nodes.Count; a++)
{
if (treeView1.Nodes[a].Checked)
{
MessageBox.Show(treeView1.Nodes[a].Text);
}
}
}

irana8
سه شنبه 18 شهریور 1393, 12:15 عصر
با تشکر
این کد فقط نود ها را برمیگردونه و با child ها کاری نداره.من میخام زیر نود ها رو هم برگردونه.ممنون

مجید آرتا
سه شنبه 18 شهریور 1393, 12:51 عصر
بفرمایید اینو تست کنید

private void button3_Click(object sender, EventArgs e)
{

for ( int i = 0; i < treeView1.Nodes.Count; i++)
{
for (int j = 0; j < treeView1.Nodes[i].Nodes.Count; j++)
{
for (int k = 0; k < treeView1.Nodes[i].Nodes[j].Nodes.Count; k++)
{
MessageBox.Show(treeView1.Nodes[i].Text +Environment.NewLine+ treeView1.Nodes[i].Nodes[j].Text +Environment.NewLine+treeView1.Nodes[i].Nodes[j].Nodes[k].Text);
}
}
}

}

محمد آشتیانی
سه شنبه 18 شهریور 1393, 12:52 عصر
سلام
با استفاده از این متد ها میتونی کل treeviewرو به صورت بازگشتی پیمایش کنی

شما کافیه متد اول رو فراخوانی کنی و اسم کنترل treeviewرو به عنوان پارامتر بهش پاس بدی (متد دوم برای بدست آوردن نود های فرزند هستش که توسط متد اول فراخوانی میشه)


private void ParseTreeView(TreeView Tree)
{
foreach (TreeNode pn in Tree.Nodes)
{
string value;
if (pn.Checked)
value = Convert.ToString(pn.Tag);
GetAllNodes(pn);
}
}



private void GetAllNodes(TreeNode pn)
{
foreach (TreeNode cn in pn.Nodes)
{
string value;
if (cn.Checked)
value = Convert.ToString(cn.Tag);
GetAllNodes(cn);
}
}




موفق باشید.

alexmcse
دوشنبه 20 بهمن 1393, 17:09 عصر
سلام
با استفاده از این متد ها میتونی کل treeviewرو به صورت بازگشتی پیمایش کنی

شما کافیه متد اول رو فراخوانی کنی و اسم کنترل treeviewرو به عنوان پارامتر بهش پاس بدی (متد دوم برای بدست آوردن نود های فرزند هستش که توسط متد اول فراخوانی میشه)


private void ParseTreeView(TreeView Tree)
{
foreach (TreeNode pn in Tree.Nodes)
{
string value;
if (pn.Checked)
value = Convert.ToString(pn.Tag);
GetAllNodes(pn);
}
}



private void GetAllNodes(TreeNode pn)
{
foreach (TreeNode cn in pn.Nodes)
{
string value;
if (cn.Checked)
value = Convert.ToString(cn.Tag);
GetAllNodes(cn);
}
}




موفق باشید.


سلام
آقای آشتیانی چطور از متد استفاده کنیم ؟
در چه رویدادی باید نوشته شود؟
لطفا راهنمایی کنید

محمد آشتیانی
دوشنبه 20 بهمن 1393, 17:45 عصر
سلام
ببینید با توجه به سوال اولیه تاپیک ، این متدها برای TreeView هایی که چک باکس دارن کار میکنه ، در واقع توسط این متدها شما به همه گره های TreeView دسترسی پیدا میکنید و میتونید مقادیر Name , Tag و یا چک خورده بودن اون گره رو بررسی کنید
برای مثال شما میتونید یه لیست به صورت پابلیک تعریف کنید و مقادیر گره های پدر و فرزند TreeView رو داخل اون لیست بریزید.
(اینجا برای TreeView بدون چک باکس کار میکنه)


private List<string> TV = new List<string>();
private void ParseTreeView(TreeView Tree)
{
foreach (TreeNode pn in Tree.Nodes)
{
TV.Add(Convert.ToString(pn.Name));
GetAllNodes(pn);
}
}

private void GetAllNodes(TreeNode pn)
{
foreach (TreeNode cn in pn.Nodes)
{
TV.Add(Convert.ToString(cn.Name));
GetAllNodes(cn);
}
}



فراخوانیش هم به این صورت میشه (برای مثال در رویداد کلیک Button)


ParseTreeView(treeView1);




موفق باشید

alexmcse
دوشنبه 20 بهمن 1393, 19:08 عصر
سلام
چگونه میتوان parent های یک node را بدست آورد?
(تمام parent ها)
لطفا به عکس نگاه کنید

تشکر

محمد آشتیانی
سه شنبه 21 بهمن 1393, 01:01 صبح
سلام
یه متد بنویس به این شکل (که بصورت بازگشتی گره های Parent رو تا بالاترین سطح پیدا میکنه


private void SelectParents(TreeNode node)
{
var parent = node.Parent;
if (parent == null)
return;
parent.Checked = true;
SelectParents(parent);
}



تو رویداد AfterSelect مربوط به TreeView هم


treeView1.SelectedNode.Checked = true;
SelectParents(treeView1.SelectedNode);




موفق باشید.