PDA

View Full Version : حرفه ای: نمایش اطلاعات جداول در treeview



حسین.کاظمی
سه شنبه 22 دی 1394, 21:28 عصر
باسلام به همه دوستان برنامه نویس
قطعه کد زیر را برای نمایش یک فیلد از یک جدول در کنترل treeview استفاده می کنم و هیچ گونه خطا و ایرادی هم نداره.


string strCnn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\*.mdb; Persist" + " Security Info=True;Jet OLEDB:Database Password=*********";
OleDbConnection con = new OleDbConnection(strCnn);
con.Open();
DataSet ds = new DataSet();
OleDbDataAdapter adapter1 = new OleDbDataAdapter();
string text1 = "select Name_Co , id_sherkat from tbl_co";
new OleDbDataAdapter(text1, con).Fill(ds, "tbl_co");
foreach (DataRow row1 in ds.Tables["tbl_co"].Rows)
{
TreeNode node1 = new TreeNode();
node1.Text = Convert.ToString(row1["Name_Co"]);
treeView1.Nodes.Add(node1);
}



خب حالا سوالم اینکه اگر بخواهیم اطلاعات را از سه جدول بصورت سلسه مراتب زیر نمایش دهیم چطوریه؟؟؟
1-نام شرکت
2-عنوان شغل
3-شغل های زیر مجموعه بند 2
آهان راستی از اکسس دارم استفاده می کنم!!!

یه چیز مشابه این می خوام
راهنمایی،سمپل،نمونه کد هم بدید ممنونتون میشم.
138349

ژیار رحیمی
سه شنبه 22 دی 1394, 22:56 عصر
اهان!!!! دوست گرامی در نمایش ساختار درختی اصولا یک جدول که بصورت خود رفرنس (ارجاع به خود) میباشد پیاده سازی میشود.ولی با استفاده از چند جدول نه که قابل پیاده سازی نباشه ولی دردسر خاص خودشو داره من به شخصه پیشنهاد نمیکنم.قبلا هم در این انجمن بحث شده می تونی از راهنمایی های صورت گرفته بهره ببری.

khokhan
سه شنبه 22 دی 1394, 23:59 عصر
اهان!!!! دوست گرامی در نمایش ساختار درختی اصولا یک جدول که بصورت خود رفرنس (ارجاع به خود) میباشد پیاده سازی میشود.ولی با استفاده از چند جدول نه که قابل پیاده سازی نباشه ولی دردسر خاص خودشو داره من به شخصه پیشنهاد نمیکنم.قبلا هم در این انجمن بحث شده می تونی از راهنمایی های صورت گرفته بهره ببری.

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

con = new OleDbConnection(ConString);
CmdString = "SELECT ID, Management FROM Managements";
cmd = new OleDbCommand(CmdString, con);
sda = new OleDbDataAdapter(cmd);
dt = new DataTable();


sda.Fill(dt);


for (int i = 0; i < dt.Rows.Count; i++)
{

menagCode = dt.Rows[i]["ID"].ToString();
menag = dt.Rows[i]["Management"].ToString();

menagNode = new TreeNode(menag);
menagNode.ImageIndex = 2;
CmdString = "SELECT ID,maneg_code, Assistant FROM Assistants WHERE maneg_code=@menagCode ";
cmd = new OleDbCommand(CmdString, con);
cmd.Parameters.AddWithValue("@menagCode", menagCode);
sda = new OleDbDataAdapter(cmd);
dt2 = new DataTable();


sda.Fill(dt2);


for (int j = 0; j < dt2.Rows.Count; j++)
{
Assist_code = dt2.Rows[j]["ID"].ToString();
Assistant = dt2.Rows[j]["Assistant"].ToString();

AssistNode = new TreeNode(Assistant);
AssistNode.ImageIndex = 1;

menagNode.Nodes.Add(AssistNode);

CmdString = "SELECT ID, Job FROM Jobs WHERE Assist_code=@Assist_code";
cmd = new OleDbCommand(CmdString, con);
cmd.Parameters.AddWithValue("@Assist_code", Assist_code);
sda = new OleDbDataAdapter(cmd);
dt3 = new DataTable();

sda.Fill(dt3);


for (int k = 0; k < dt3.Rows.Count; k++)
{

AssistCode = dt3.Rows[k]["ID"].ToString();
CityName = dt3.Rows[k]["Job"].ToString();


CityNode = new TreeNode(CityName);
CityNode.ImageIndex = 0;

AssistNode.Nodes.Add(CityNode);
}
}
Rootnode.Nodes.Add(menagNode);
}

treeView1.Nodes.Add(Rootnode);

ژیار رحیمی
چهارشنبه 23 دی 1394, 11:33 صبح
حرف شما درست این به بحث تحلیل و طراحی برمیگرده.بعد از مدتی که برنامه توزیع شد و دست مشتریه بخواهی قابلیتی به برنامه ت اضافه کنی که قبلا بهش فکر نکردی این مشکلاتو داره (شما تا یه جای محدودی امکان توسعه خواهی داشت ).در اینجا بحث طراحی کارامد برای پیاده سازی بخشی از نرم افزار میباشد.
اگر مشتری یه سری قابلیت دیگه بخواد به ساختار Tree اضافه شود و کافیه یکی از چندین جداول استخراج Tree این امکان جدید رو پشتیبانی نکنند دیگر امکان توسعه یی نخواهیم داشت.

حسین.کاظمی
پنج شنبه 24 دی 1394, 18:15 عصر
سلام دوستان عزیز
تشکر بابت جواب هاتون
جناب آقای khokhan عزیز،چرا برنامه ایی که ضمیمه کردید اجرا نمیشه؟؟؟؟؟؟

تشکر

حسین.کاظمی
پنج شنبه 24 دی 1394, 19:31 عصر
آقـــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــا حل شد............
تشکر

حسین.کاظمی
جمعه 25 دی 1394, 00:28 صبح
دوستان تشکر تا اینجا درست شد
حالا می خوام کاربر وقتی یک مسیری را انتخاب کرد مثل تصویر زیر مقادیر نود های انتخا بشده به صورت جداگانه در تکست باکس مربوطه قرار بگیرد
138401
مثلا
کاربر با انتخاب "اپراتور توزیع غذا"
مقدار "اداری" بره تو تکست باکس مربوطش
مقدار"خدمات غذا خوری" بره تو تکست باکس مربوطش
مقدار"اپراتور توزیع غذا" بره تو تکست باکس مربوطش

باتشکر

khokhan
جمعه 25 دی 1394, 01:32 صبح
دوستان تشکر تا اینجا درست شد
حالا می خوام کاربر وقتی یک مسیری را انتخاب کرد مثل تصویر زیر مقادیر نود های انتخا بشده به صورت جداگانه در تکست باکس مربوطه قرار بگیرد

مثلا
کاربر با انتخاب "اپراتور توزیع غذا"
مقدار "اداری" بره تو تکست باکس مربوطش
مقدار"خدمات غذا خوری" بره تو تکست باکس مربوطش
مقدار"اپراتور توزیع غذا" بره تو تکست باکس مربوطش

باتشکر

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


if(e.Node.Parent!= null && e.Node.Parent.GetType() == typeof(TreeNode) )
{
Label1.Text = "Parent: " + e.Node.Parent.Text + ;
}
و همچنین برای اینکه مقدار گره پدر بزرگ رو بدست بیاری بایستی کلمهParent رو دوباربنویسی
با این حساب کد های رویداد AfterSelect شما بایستی اینطوری باشه :


private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Parent != null && e.Node.Parent.Parent != null && e.Node.Parent.GetType() == typeof(TreeNode))
{
textBox1.Text = e.Node.Parent.Text ;
textBox2.Text = e.Node.Parent.Parent.Text;
}
else if (e.Node.Parent != null && e.Node.Parent.Parent == null && e.Node.Parent.GetType() == typeof(TreeNode))
{
textBox1.Text = textBox2.Text = string.Empty;
textBox1.Text = e.Node.Parent.Text;

}
}

حسین.کاظمی
جمعه 25 دی 1394, 02:19 صبح
khokhanجان
هرکاری میکنم نمیشه
اون ند های مثل نود اپراتور توزیع غذا و پدرو پدربزرگش بدست نمیاد(بترتیب)