Xenical
 
Xenical
بنر


نمایش درختی در کنترل های دات نت

  • مشاهده در قالب پی دی اف

سلام. وقتی برای برنامه ای می نویسید که داده هاش رو از پایگاه داده می گیره، ممکنه لازم بشه برای داده هاتون دسته بندی قائل بشید. اگه یه سایت خبری داشتید، ممکنه دسته بندی مثل ایران، جهان، منطقه، سیاسی، اقتصادی و ... مد نظرتون باشه یا اگه یک برنامه ی فروشگاه یا حسابداری داشتید شاید خواستید محصولاتتون رو دسته بندی کنید. اگه دسته های مورد نظرتون تو در تو نبود که هیچی، اما اگه دسته بندی شما تو در تو بود، بدونید موضوع این پست ما همینه. چطور دسته های تو در تو برای برناممون به وجود بیاریم و توی کنترل های دات نت نشونشون بدیم؟

نمایش درختی در ListBox و TreeView

قبل از اینکه توضیح بدیم چطور این دسته ها رو باید نشون بدیم لازمه بدونیم که روش خاصی برای این کار نیست. همون طوری که برای یک مسئله ممکنه هزاران راه حل وجود داشته باشه، برای این مسئله هم راه های زیادی وجود داره. هر برنامه نویسی، بسته به کارش و طرز تفکرش یه جور این کارو انجام میده. ممکنه یک نفر بخواد دسته هاش رو به صورت XML در یه فایل درختی XML ذخیره کنه و بعدا بازیابیشون کنه یا ممکنه یه نفر به ازای تمام دسته هاش یک جدول توی پایگاه دادش به وجود بیاره! (دیدم که می گما!)

موضوع اینه که اکثر کسانی که این دسته بندی رو انجام میدن، از یه روش معمول و ساده به نتیجه می رسند. بزارید توضیح بدم روش معمول برای ذخیره کردن دسته های تو در تو در پایگاه داده چی هست. در پایگاه داده (Data Base) یک جدول بسازید به نام Category یا Categories. این جدول باید دارای حداقل 3 فیلد باشه. فیلد های ID، Name و ParentID رو توش بسازید. بعد از اون داده هاتون رو به این صورت وارد می کنید که اگر دسته ی شما در شاخه ی اصلی درخت (root) قرار داشت، ParentID اون باید صفر یا null باشه. حالا اگر دستتون، زیر مجموعه ی دسته ی دیگه ای بود، ParentID اون، میشه ID شاخه ای که والد اون مجموعه حساب میشه. برای شکل بغل دست همین مطلب چنین چیزی رو داریم :

 

ID Name ParentID
1 خبري 0
2 مقالات 0
3 اسلام 2
4 ملل 2
5 عراق 4
6 بغداد 5
7 کربلا 5
8 مصر 4
9 سوريه 4
10 درباره 0

به جدول کشیده شده دقت کنید. وقتی منطق این جدول رو درک کردید، کار برنامه نویسیش خیلی راحت میشه.

حالا به سراغ برناممون در دات نت می ریم. در دات نت، کنترلی وجود داره به نام TreeView که با چند تا تنظیم ساده، امکان نمایش درختی والد/فزرند (Parent/Child) رو براتون فرهم می کنه. اگه خواستید از TreeView استفاده کنید آموزشش رو در اینترنت جستجو کنید.

وقتی لازم بشه کاربر، موقع وارد کردن محصول، مطلب یا خبر دسته بندی خودش رو مشخص کنه، شما باید دسته هاتون رو یه جوری به کاربر نشون بدید و بفهمونید که این دسته ها هر کدوم زیر مجموعه ی کدوم دسته هستند. می تونید این کار رو با استفاده از DataGridView انجام بدید که کمی کار رو مشکل می کنه و یا می تونید توی کنترل های List که امکان انتخاب یک گزینه رو به کاربر میده دسنه ها رو نمایش بدید. اگر خواستید دسته ها به صورت درختی در این کنترل ها نمایش داده بشن، شما باید یکمی براش برنامه نویسی کنید. در واقع باید برنامه ای بنویسید که به ازای تمام دسته ها، بتونه زیر مجموعه هاش رو زیر خودش نشون بده. شاید توی درس طراحی الگوریتم ها با مفهوم پیمایش درختی یک درخت آشنا باشید. در واقع شما باید درخت دسته هاتون رو یکی یکی پیمایش کنید و نمایش بدید.

همون طوری که می دونید پیمایش درخت ها راه های زیادی داره. روشی که اینجا ما می خوایم بگیم، (در واقع نمی دونم اسمش چی هست) پیشمایش درخت به روش بازگشتی هست. به این صورت که ما یک تابع بازگشتی می نویسیم که عمل پیمایش رو به ازای تک تک مجموعه های دارای زیر مجموعه توی خودش انجام بده تا به ریشه یا Root برسه. به علاوه ی اینکه همونجا هم اونو چاپ کنه.

خیلی راحت کار رو شروع می کنیم. اول باید داده های موجود در جدول Category رو از دیتابیس بکشیم بیرون و توی یک DataTabel یا DataSet استفاده کنیم. مسلما اگه از روش های دیگری غیر از ADO.Net داریم استفاده می کنیم می تونیم داده ها رو توی چیز های دیگری نگه داری کنیم. برای این کار یک تابع می نویسیم و خروجیش رو از نوع DataTable قرار می دیم.

 
/// <summary>
/// دسته ها را بر می گرداند.
/// </summary>
/// <returns></returns>
System.Data.DataTable GetCategories()
{
System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["mainConnetctionString"].ConnectionString);
System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
command.Connection = connection;
command.CommandText = "Select * from dbo.Categories ";
 
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(command.CommandText, connection);
System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);
 
return dt;
} 

 

در قسمت Global یک متغیر از نوع DataTable می سازیم. حالا وقتی صفحه یا فرم مشغول بارگذاری (بارگزاری؟) هست مقدار این متغیر رو تابع می زاریم. این کار به خاطر اینه که در آغاز کار فرم یا صفحه داده های جدول Categories در یک DataTable ذخیره بشن و بتونیم در سراسر صفحه با فرم ازش استفاده کنیم.

System.Data.DataTable cats;
 

 

حالا با داشتن این داده های خام، شروع به نوشتن الگوریتم بازگشتی پیمایش درختمون می کنیم. یادتون باشه که توی همون الگوریتم، مستقیما DropDownList، DropDownBox، ListBox یا TextBox یا هر کنترل دیگه ای که می خوایم توش نمایش داده بشه رو مقدار دهی می کنیم.

 

public void CreateList(string _ParentID, string _indent)
{
System.Data.DataRow[] drArray;
if (_ParentID.Trim() == "0")
{
drArray = cats.Select("ParentID = '0'");
}
else
{
_indent += "--";
drArray = cats.Select("ParentID = '" + _ParentID + "'");
}
foreach (System.Data.DataRow dr in drArray)
{
drpCategories.Items.Add(new ListItem(_indent +" "+ dr[1].ToString(), dr[0].ToString()));
CreateList(dr[0].ToString(), _indent);
}
}

 

حالا موقع صدا زدن توابعمون هست! در ایونت Load صفحه یا Page این توابع رو به این صورت صدا می زنیم :

drpCategories.Items.Clear();
cats = GetCategories();
 
CreateList("0", "");

به همین راحتی نتیجه ای مثل این خواهیم داشت :

نمایش درختی مجموعه ها در DropDown

این مسئله با وجود سادگی، بین خیلی از برنامه نویس ها هنوز یک مسئله ی نسبتا گنگ محسوب میشه. امیدوارم با این پست تونسته باشیم به سوال شما پاسخ داده باشیم. این رو بدونید که درسای دانشگاه همچین بدون استفاده هم نمی مونن. نمونش همین مسئله که با دونستن یه الگوریتم پیمایش قابل حله. جا داره از آقای حسین آزاد منش به خاطر راهنماییشون تشکر کنم.

 

 

آخرین بروز رسانی مطلب در يكشنبه ، 4 دی 1390 ، 10:23

نظرات (2)
1پنجشنبه ، 6 بهمن 1390 ، 06:07
استاد زانيس
استاد زانیس، ارائه دهنده بسته های آموزش تصویری دروس دانشگاه پیام نور
شامل:
فیلم آموزشی تدریس اساتید برجسته
حل تمرین های كتاب درسی
آزمون ساز پیشرفته
كارگاه های برنامه نویسی (ویژه دروس رشته كامپیوتر)
نمونه سوالات 10 ترم اخیر دانشگاه پیام نور به همراه پاسخ تشریحی
پشتیبانی عملی بصورت آنلاین
و امكاناتی دیگر......
http://eostad.ir
2يكشنبه ، 10 ارديبهشت 1391 ، 07:13
saeed
سلام.دوستان عزیز اگه ممکنه آدرس مراکز تهیه نمونه سوال نزدیک دانشگاهو برام ایمیل کنین.چون من از شهرستان میامو ادرس دانشگاهم بلد نیستم.
ممنون میشم.[چشمک]

ارسال نظرات شما

نام شما:
ایمیل شما:
وبسایت شما:
نظر:

تماس با ما

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

مطالب شما

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

  • ایمیل : info@jpcs.ir

درباره ما

انجمن علمی کامپیوتر دانشگاه پیام نور شامل انجمن های علمی رشته های مهندسی کامپیوتر (نرم افزار ) و علوم کامپیوتر می باشد که در حال حاضر با آغاز ترم تحصیلی جدید، اعضای جدیدی در آن ها به فعالیت می پردازند.

هم اکنون اینجایید : آموزشی نمایش درختی در کنترل های دات نت