PDA

View Full Version : سوال: کمک در طراحی ساختار درختی



رامین مرادی
سه شنبه 13 تیر 1396, 15:49 عصر
دوستان ممنون میشم کمک کنید راجب ساختار درختی. مثلا اسم کشور ها که زیر شاخه هر کدوم اسم شهر ها و زیر شاخه شهر ها روستاها باشه.
کلا هم جدول مورد نیاز هم نحوه کار باهاش. با tree view یا هر چیز دیگه :ناراحت:

ebrahim.rayatparvar
سه شنبه 13 تیر 1396, 19:12 عصر
ببن توم اسم شهرها یا هر ایتمی برای خودش یه کد یا id داره حالا تو باید یه فیلد پدر هم داشته باشی مثلا بگی مازندارن کدش هست 1001 ساری کدش 2001 ولی کد پدر ساری هست 1001 یا قائمشهر کدش هست 2002 کد پدرش هست 1001 دقت کنی ساری و قائمشهر میشن زیر مجموعه مازندران چون پدرشون گفتیم مازندرانه حالا A مثلا کد پدرش میشه 2002 یعنی A زیر مجموعه قائمشهر میشه.

رامین مرادی
چهارشنبه 14 تیر 1396, 08:18 صبح
ببن توم اسم شهرها یا هر ایتمی برای خودش یه کد یا id داره حالا تو باید یه فیلد پدر هم داشته باشی مثلا بگی مازندارن کدش هست 1001 ساری کدش 2001 ولی کد پدر ساری هست 1001 یا قائمشهر کدش هست 2002 کد پدرش هست 1001 دقت کنی ساری و قائمشهر میشن زیر مجموعه مازندران چون پدرشون گفتیم مازندرانه حالا A مثلا کد پدرش میشه 2002 یعنی A زیر مجموعه قائمشهر میشه.

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

meysam_online2012
چهارشنبه 14 تیر 1396, 09:20 صبح
اگه میخوای توی صفحات وب پیاده سازی کنی میتونی از jstree استفاده کنی بنظر من ابزار ققدرتمندیه برای تشکیل درخت

برای جدول هم همنطور که دوستمون گفت میتونی از ساختار parent child استفاده کنی


یه نگاهی به لینک زیر بنداز

https://www.jstree.com/

رامین مرادی
چهارشنبه 14 تیر 1396, 10:24 صبح
اگه میخوای توی صفحات وب پیاده سازی کنی میتونی از jstree استفاده کنی بنظر من ابزار ققدرتمندیه برای تشکیل درخت

برای جدول هم همنطور که دوستمون گفت میتونی از ساختار parent child استفاده کنی


یه نگاهی به لینک زیر بنداز

https://www.jstree.com/

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

private void PopulateTreeView(DataTable dtParent, int parentId, TreeNode treeNode)
{
foreach (DataRow row in dtParent.Rows)
{
TreeNode child = new TreeNode
{
Text = row["Name"].ToString(),
Value = row["Id"].ToString()
};
if (parentId == 0)
{
TreeView1.Nodes.Add(child);
DataTable dtChild = this.GetData("SELECT Id, Name FROM VehicleSubTypes WHERE VehicleTypeId = " + child.Value);
PopulateTreeView(dtChild, int.Parse(child.Value), child);
}
else
{
treeNode.ChildNodes.Add(child);
}
}
}
الان به نظرتون کامپوننتی هست که بشه این درخت رو به صورت شکلی که تو نرم افزار ویزیو رسم میشه، رسم کرد؟
یا روش دیگه ای

meysam_online2012
چهارشنبه 14 تیر 1396, 12:23 عصر
به نظرم با treeview میشه اینکارو کرد
توی toolbox هستش میتونی ازش استفاده کنی

این لینکم توضیح داده چطور ایتم اضافه کنی
https://msdn.microsoft.com/en-us/library/aa984278(v=vs.71).aspx

رامین مرادی
چهارشنبه 14 تیر 1396, 14:57 عصر
به نظرم با treeview میشه اینکارو کرد
توی toolbox هستش میتونی ازش استفاده کنی

این لینکم توضیح داده چطور ایتم اضافه کنی
https://msdn.microsoft.com/en-us/library/aa984278(v=vs.71).aspx

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

145692

mr.sirwan
چهارشنبه 14 تیر 1396, 19:21 عصر
یعنی تو طراحی جدولش مشکل دارین؟ خب اینکه چیز ساده ایه، اینم ساختار جدولاتون:
Country table: Id, Name

States table: Id, Name, CountryId

Cities table: Id, Name, StateId

Areas table: Id, Name, CityId


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

رامین مرادی
پنج شنبه 15 تیر 1396, 08:00 صبح
یعنی تو طراحی جدولش مشکل دارین؟ خب اینکه چیز ساده ایه، اینم ساختار جدولاتون:
Country table: Id, Name

States table: Id, Name, CountryId

Cities table: Id, Name, StateId

Areas table: Id, Name, CityId


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


ممنون بخاطر جواب مفیدتون. فقط اون تابع تا دو سطح جواب منو میده .


:افسرده:
اگه راهی میدونید ممنون میشم راهنماییم کنید.

meysam_online2012
پنج شنبه 15 تیر 1396, 08:45 صبح
ممنون بخاطر جواب مفیدتون. فقط اون تابع تا دو سطح جواب منو میده .


:افسرده:
اگه راهی میدونید ممنون میشم راهنماییم کنید.


من خودم همین کارو با جدول parent child انجام دادم

کلا یه جدول میسازی


region_Table:id,Name,Parent_id,Region_type


گزینه های id و name که مشخص هستن parent id شماره منطقه بالاتره که باید allow null باشه و type هم نوع منطقه هستش که میتونه کشور استان شهرستان و... باشه

شما کافیه کشور ایران که وارد میکنی رو parent رو null بذاری یه حلقه درست کنی که از null شروع کنه به اضافه کردن به درخت و مرحله دو فیلد هایی که parent برابر با id فیلد اول هست رو اضافه کنه به همین ترتیب.

اینم تصویره درختیه که خودم با همین روش پیاده کردم

رامین مرادی
پنج شنبه 15 تیر 1396, 09:40 صبح
من خودم همین کارو با جدول parent child انجام دادم

کلا یه جدول میسازی


region_Table:id,Name,Parent_id,Region_type


گزینه های id و name که مشخص هستن parent id شماره منطقه بالاتره که باید allow null باشه و type هم نوع منطقه هستش که میتونه کشور استان شهرستان و... باشه

شما کافیه کشور ایران که وارد میکنی رو parent رو null بذاری یه حلقه درست کنی که از null شروع کنه به اضافه کردن به درخت و مرحله دو فیلد هایی که parent برابر با id فیلد اول هست رو اضافه کنه به همین ترتیب.

اینم تصویره درختیه که خودم با همین روش پیاده کردم

شرمنده اصلا متوجه نشدم. اگه امکانش هست سورس یا نمونه کد بدین :ناراحت:
تنها بحث پر کردن نیست . بعد امکان درج هم برا خودش مسئله ای هست . کلا در این باره صفر صفر هستم بلد نیستم با تری ویو کار کنم :گریه:

meysam_online2012
پنج شنبه 15 تیر 1396, 09:50 صبح
شرمنده اصلا متوجه نشدم. اگه امکانش هست سورس یا نمونه کد بدین :ناراحت:
تنها بحث پر کردن نیست . بعد امکان درج هم برا خودش مسئله ای هست . کلا در این باره صفر صفر هستم بلد نیستم با تری ویو کار کنم :گریه:


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

سعی میکنم تا امشب کدشو بنویسم اپلود کنم واست

از ef استفاده می کنی؟

رامین مرادی
پنج شنبه 15 تیر 1396, 10:16 صبح
درج که مساله ای نداره کیلک راست میکنی منو باز میشه id انتخاب شده رو میگیری و زیر مجموعش گره اضافه میکنی

سعی میکنم تا امشب کدشو بنویسم اپلود کنم واست

از ef استفاده می کنی؟
ممنون دوست عزیز.:قلب::لبخندساده:
نه من با ado.net کد میزنم.

meysam_online2012
شنبه 17 تیر 1396, 08:56 صبح
ببخش دوست عزیز اگه طول کشید چند روزی درگیر کار بودم شرمنده

اینم فایل پروژه

ASKaffash
دوشنبه 19 تیر 1396, 07:37 صبح
سلام
اگر از SQLSever بالای 2005 استفاده می کنید نیازی به برنامه نویسی سمت #C ندارید با CTE اینکار را انجام دهید در اینترنت سرچ کنید با چند خط کد ساده SQL درخت با هر سطح را فقط با سه فیلد ساده شبیه سازی کنید :
کد نود / کد پدر / عنوان نود

رامین مرادی
دوشنبه 19 تیر 1396, 09:12 صبح
سلام
اگر از SQLSever بالای 2005 استفاده می کنید نیازی به برنامه نویسی سمت #C ندارید با CTE اینکار را انجام دهید در اینترنت سرچ کنید با چند خط کد ساده SQL درخت با هر سطح را فقط با سه فیلد ساده شبیه سازی کنید :
کد نود / کد پدر / عنوان نود

من با 2014 کار میکنم. ممنون بخاطر راهنماییتون من خودم سرچ میکنم اما اگه شما هم لینکی دارید ممنون میشم اینجا بنویسید

رامین مرادی
چهارشنبه 28 تیر 1396, 13:27 عصر
دوستان ممنون میشم در مورد
CTE برای ایجاد ساختار درختی که در پست 7 نشون دادم کمکم کنید.

ASKaffash
چهارشنبه 28 تیر 1396, 15:06 عصر
سلام
یک کدی شبیه این لازم دارید :

With MyCTE(mPK,mFK) As
(
Select PK,FK
From MyTree
Where FK=0
Union All
Select PK=PK,FK=FK
From MyTree
Where FK=mPK
)
Select *
From MyCTE

رامین مرادی
پنج شنبه 29 تیر 1396, 10:36 صبح
سلام
یک کدی شبیه این لازم دارید :

With MyCTE(mPK,mFK) As
(
Select PK,FK
From MyTree
Where FK=0
Union All
Select PK=PK,FK=FK
From MyTree
Where FK=mPK
)
Select *
From MyCTE



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

ASKaffash
شنبه 31 تیر 1396, 06:23 صبح
سلام
این موضوع مربوط به بخش SQLServer است ولی کلی :

شما یک جدول بنام MyTree سه فیلدی شامل Pk نود (همان کلید جدول) , Pk پدر (همان Fk) و نام آیتم مورد نظر ایجاد کنید و یک SP بنویسید که شامل دستور ارائه شده باشد خروجی این دستور کل درخت شما خواهد بود