PDA

View Full Version : سوال: اضافه کردن بی نهایت آیتم به Treeview



Tender_1372
دوشنبه 17 بهمن 1390, 10:38 صبح
سلام دوستان
خسته نباشید

من میخوام یکسری اطلاعات رو از بانک بخونم و بریزم توی Treeview

البته چون این شی دیتاسورس نداره مجبورم با حلقه این کارو کنم

ولی واسه ی هرسطح از آیتم ها باید یه حلقه ی جدا بوجود بیارم

یعنی اگه یه تیتر داریم با نام "ورزش" باید اینو بایه حلقه بندازم و اگه این آیتم زیر مجموعه ای داشته باشه
اوناروبا یه حلقه ی دیگه بندازم

میخوام این اضافه سازی سطح تا بینهایت ادامه پیدا کنه ومجبور به محدود کردن کاربر نشم

اگه روالیو میدونین که اینکارو کنه ممنون میشم به منم بگید.

cherchil_hra
دوشنبه 17 بهمن 1390, 13:49 عصر
جدول سمت بانکت چه فیلدهایی داره؟
به برنامه چی پاس می دی؟

می تونی از تابع بازگشتی استفاده کنی. اول نودهای ریشه رو بخونی و واسه هرکدوم زیر مجموعه اش رو ...

اینجا رو هم ببین. (http://barnamenevis.org/showthread.php?322850-%D9%86%D8%AD%D9%88%D9%87-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-treeView-%D8%A8%D8%B5%D9%88%D8%B1%D8%AA-%D8%A7%D8%B1%D8%AA%DB%8C%D8%A7%D8%B7-%D8%A8%D8%A7-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C&p=1421040&viewfull=1#post1421040)

Tender_1372
دوشنبه 17 بهمن 1390, 18:43 عصر
ممنون دوست عزیز

اما مشکل من اضافه کردنش نیست

مسئله اینجاست که من وقتی بخوام این اطلاعات رو از بانک بخونم معلوم نیست که این آیتم Root چندتا زیر گروه داره یا اینکه زیر گروه های این آیتم زیر گروهی دارن یا نه و این روال شاید تا بینهایت ادامه داشته باشه

مثل یه بخش از یه مقاله که چندتا فصل داره شاید هر فصل به چند بخش تقسیم بشن شاید نشن
شاید هربخش به بخشهای دیگه تقسیم بشن شاید نشن

واسه ی همین معلوم نیست وقتی که میخوام این Treeviewرو پرکنم چندبار باید از حلقه استفاده کنم

مشکل من اینجاست که اگه بخواد واسه ی پرکردن از حلقه استفاده کنم این پر کردن محدود میشه و من اینو نمیخوام

ممنون میشم اگه روال دیگه ای رو بهم بگین که این مشکل بوجود نیاد :خجالت: :لبخندساده:

cherchil_hra
چهارشنبه 19 بهمن 1390, 08:08 صبح
نه دوست عزیز اینقدر پیچیده نیست. این چیزی که من به شما گفتم نامحدوده.

راه شما تابع بازگشتی هستش:

1. تمام اطلاعات مربوطه از بانک رو می خونی
2. در حلقه روی datatable فیلتر می زنید که تمام نودهای (node) ریشه رو بخونه.
3.کد نودهای ریشه (مثلا a,b,c)، میشه کد سرگروه نودهایی که زیرگروهش هستند.
3. پس دوباره تابع رو صدا می زنی که نودهایی رو بیاره که پدرشون a هست. (a1,a2)
4.اینکار تکرار میشه یعنی روی a1 فیلتر زده میشه.
5. وقتی تمام زیر مجموعه a پیدا شد، چون تابع بازگشتی هست نوبت b میشه و ...

من خودم طبق چیزی که اینجا گفتم (لینک (http://barnamenevis.org/showthread.php?322850-%D9%86%D8%AD%D9%88%D9%87-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-treeView-%D8%A8%D8%B5%D9%88%D8%B1%D8%AA-%D8%A7%D8%B1%D8%AA%DB%8C%D8%A7%D8%B7-%D8%A8%D8%A7-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C&p=1421040&viewfull=1#post1421040)) گروه بندی رو انجام میدم (می تونه دسته بندی مقاله باشه، سلسله مراتب... خلاصه هرچیزی که می خوای دسته بندی کنی)

کدش هم اینه. ساده است:

TreeNode[] tn = ShowTree_Group(dt, "ParentCode is null");

private static TreeNode[] ShowTree_Group(DataTable dt, string cmd)
{
DataRow[] datarow1 = dt.Select(cmd);
int len = datarow1.Length;
TreeNode[] arrNode = new TreeNode[len];

for (int i = 0; i < len; i++)
{
arrNode[i] = new TreeNode();
arrNode[i].Name = (datarow1[i].ItemArray)[0].ToString();//ChildCode
arrNode[i].Text = (datarow1[i].ItemArray)[2].ToString();//Name

TreeNode[] t = ShowTree_Group(dt, "ParentCode=" + arrNode[i].Name);
arrNode[i].Nodes.AddRange(t);
}

return arrNode;
}


تمام اطلاعات از بانک رو میخونیم و در datatable قرار میدیم (dt). فیلترمون رو مشخص میکنیم ParentCode is null یعنی نودهای ریشه. چون قبلش نودی نیست، پس والدشون null هست.
بعد تابع ShowTree_Group که بازگشتی هست شروع میشه. با پیدا کردن هر نود چک می کنه ببینه زیرمجموعه داره ... تا برسه به آخرین نود اون ریشه.
آخرین نود(x) چون زیر مجموعه نداره، وقتی تابع صدا زده میشه (نودهایی که والدشون x هست) مقداری وجود نداره پس arrNode خالی بر میگرده.
یه مرحله بالاتر (نود x) به آرایه اضافه میشه ...

تمام زیرمجموعه هات رو با این روش میتونی پیدا کنی. در آخر هم آرایه نودهات رو به tree اضافه می کنی:لبخند:

فیلد ChildCode
(datarow1[i].ItemArray)[0]
فیلد ParentCode که من لازمش نداشتم
(datarow1[i].ItemArray)[1]
فیلد Name من
(datarow1[i].ItemArray)[2]

Tender_1372
چهارشنبه 19 بهمن 1390, 09:51 صبح
ممنون دوست عزیز مشکلم حل شد خیلی ممنونم

فقط یه سوال دیگه ؟؟؟؟!!!! :خجالت:

چجوری وقتی که روی علامت Plus کلیک کرد بفهمم کدوم نود انتخاب شده؟؟توی رویداد AfterSelect کد زدم ولی وقتی روی علامت Plus میزنه این رویداد اتفاق نمیوفته

البته از رویدادهای After Expend و After Collapse استفاده کردم ولی نشده چون من میخوام از SelectedNode استفاده کنم توی کدم

ممنون میشم این رو هم راهنمایی کنید

طبیب دل
یک شنبه 14 اسفند 1390, 08:30 صبح
TreeNode[] tn = ShowTree_Group(dt, "ParentCode is null");

private static TreeNode[] ShowTree_Group(DataTable dt, string cmd)
{
DataRow[] datarow1 = dt.Select(cmd);
int len = datarow1.Length;
TreeNode[] arrNode = new TreeNode[len];

for (int i = 0; i < len; i++)
{
arrNode[i] = new TreeNode();
arrNode[i].Name = (datarow1[i].ItemArray)[0].ToString();//ChildCode
arrNode[i].Text = (datarow1[i].ItemArray)[2].ToString();//Name

TreeNode[] t = ShowTree_Group(dt, "ParentCode=" + arrNode[i].Name);
arrNode[i].Nodes.AddRange(t);
}

return arrNode;
}


این کد رو چه طوری در treeview نمایش بدم

cherchil_hra
یک شنبه 14 اسفند 1390, 11:12 صبح
TreeNode[] tn = ShowTree_Group(dt, "ParentCode is null");

private static TreeNode[] ShowTree_Group(DataTable dt, string cmd)
{
DataRow[] datarow1 = dt.Select(cmd);
int len = datarow1.Length;
TreeNode[] arrNode = new TreeNode[len];

for (int i = 0; i < len; i++)
{
arrNode[i] = new TreeNode();
arrNode[i].Name = (datarow1[i].ItemArray)[0].ToString();//ChildCode
arrNode[i].Text = (datarow1[i].ItemArray)[2].ToString();//Name

TreeNode[] t = ShowTree_Group(dt, "ParentCode=" + arrNode[i].Name);
arrNode[i].Nodes.AddRange(t);
}

return arrNode;
}


این کد رو چه طوری در treeview نمایش بدم

مقدار خروجی تابع آرایه ای از نودها هست. پس : treeView1.Nodes.AddRange(tn)