PDA

View Full Version : ایجاد نمودار درختی با 2 ستون ID ، Name جدول Sql



saeedhushmand
شنبه 28 مرداد 1391, 13:15 عصر
دوستان فرض کنید اطلاعات جدول من به صورت زیر باشه

91455

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

91456

اگر دقت کرده باشید توی جدول من خبری از ستون کد پدر نیست
در نمودار حداکثر level پنج است و بیش از این درست نمیشه
می خوام ستونی که IDش یک رقمی بود level اول در نمودار درختی باشند بعد ID های 3 رقمی level دوم باشند به این صورت که زیر شاخه اونی باشند که اول کدشون با کد اون یکی باشه

دوستان خیلی فوریه لطفا کمک کنید...

saeedhushmand
چهارشنبه 01 شهریور 1391, 11:39 صبح
کسی نمی تونه کمکم کنه...

string ConnStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
SqlConnection StrConn = newSqlConnection(ConnStr);
StrConn.Open();
SqlDataAdapter SqlDa1 = newSqlDataAdapter("Select CodeHesab From Acc_TbHesab ", StrConn);
DataTable Dt = newDataTable("Hesab");
SqlDa1.Fill(Dt);
foreach (DataRow column in Dt.Rows)
{
TrN1 = TrvHesabOne.Nodes.Add(column["CodeHesab"].ToString(), column["CodeHesab"].ToString());
}


دوستان راهنمایی کنید...

tooraj_azizi_1035
پنج شنبه 02 شهریور 1391, 12:27 عصر
اول اينكه يه فيلد ParentID به جدول اضافه كن و پدر هر ركورد رو مشخص كن. با استفاده از RadTreeView شركت تلريك مي توني با معرفي فيلدهاي Child و Parent درخت خودكار ساخته بشه فقط مي مونه خاصيت Text هر Node. كه مي توني با ايجاد يك View كه كد و نام رو به هم مي چسبونه اين كار رو انجام بدي.

Mahmoud.Afrad
پنج شنبه 02 شهریور 1391, 12:54 عصر
خیلی راحت میتونی این کارو انجام بدی. کل اطلاعاتو سلکت کن و بریز توی دیتاتیبل. اون رشته هایی که طولشون یک هست اضافه میکنی.
بعد اونهایی که طول سه دارند و مثلا با 1 شروع میشند باید به گره 1 اضافه بشند اونهایی که با 2 شروع میشن به 2 و... .

برای اینکه از پیمایش چند باره دیتاتیبل جلوگیری کنی باید گره های هر سطح را به لیست اضافه کنی و بعد به راحتی اضافه کنی.
ابتدا برای هر نوع گره یک کلاس تعریف میکنی
class level1
{
protected internal string id;
protected internal string name;
}
class level2
{
protected internal string id;
protected internal string name;
}
class level3
{
protected internal string id;
protected internal string name;
}
class level4
{
protected internal string id;
protected internal string name;
}

حالا لیتسی از هر نوع گره تعریف میکنی
List<level1> level_1_Nodes = new List<level1>();
List<level2> level_2_Nodes = new List<level2>();
List<level3> level_3_Nodes = new List<level3>();
List<level4> level_4_Nodes = new List<level4>();

با یک حلقه تمام گره ها را بدست بیار
foreach (DataRow dtrow in dt.Rows)
{
if (dtrow["id"].ToString().Length == 1)
level_1_Nodes.Add(new level1() { id = dtrow["id"].ToString(), name = dtrow["name"].ToString() });
else if (dtrow["id"].ToString().Length == 3)
level_2_Nodes.Add(new level2() { id = dtrow["id"].ToString(), name = dtrow["name"].ToString() });
else if (dtrow["id"].ToString().Length == 6)
level_3_Nodes.Add(new level3() { id = dtrow["id"].ToString(), name = dtrow["name"].ToString() });
else if (dtrow["id"].ToString().Length == 8)
level_4_Nodes.Add(new level4() { id = dtrow["id"].ToString(), name = dtrow["name"].ToString() });
}

گره ها رو اضافه کن
// add nodes
level_1_Nodes.ForEach(node => treeView1.Nodes.Add(node.id, node.name));
level_2_Nodes.ForEach(node => treeView1.Nodes.Find(node.id.Substring(0, 1), false).First().Nodes.Add(node.id, node.name));
level_3_Nodes.ForEach(node => treeView1.Nodes.Find(node.id.Substring(0, 3), true).First().Nodes.Add(node.id, node.name));
level_4_Nodes.ForEach(node => treeView1.Nodes.Find(node.id.Substring(0, 6), true).First().Nodes.Add(node.id, node.name));


در انتها فضای حافظه لیست ها رو آزاد کن
// clear lists after add
level_1_Nodes.Clear();
level_2_Nodes.Clear();
level_3_Nodes.Clear();
level_4_Nodes.Clear();

برای سطوح بعدی هم مشابه همینه