PDA

View Full Version : سوال: نمایش ساختار درختی از دیتابیس در TreeView در C# WinForm .Net 4



FirstLine
دوشنبه 20 بهمن 1393, 22:19 عصر
با سلام
یک برنامه اپلیکن win form در C#‎ fh با دیتابیس sql2008 دارم (Table: tblGroup : id , pid , title) که مقدار pid نودهای root برابر با null است.
یک جدول گروه Group بعنوان گروه دارم که باید اونو در یک treeView نمایش بدهم و چون تعداد استفاده اش زیاده باید اونو در یک تابع پیاده سازی کنم
تعداد زیادی مثال در اینترنت هست ولی نمیدونم چرا وقتی میارمش توی برنامه ایراد میگیره و درست کار نمیکنه، مثلا .value در .net 4 نیست و tag بجاش هست و...
الان به یک تابع نیاز دارم که در یک برنامه اپلیکن win form در C#‎ .net4 قابل استفاده باشه و نام treeview , Dataset را بهش بدهیم و خودش treeview را درست کند.
و یا اینکه یه مثال و نمونه لطفا معرفی کنید، البته الان از RadTreeView تلریک استفاده میکنم و درست هم کار میکند، ولی بنا به دلایلی نمیخوام از تلریک استفاده کنم و ترجیح میدم از ابزار استاندارد ویندوز استفاده کنم.

نکته: از VS 2013 و C# , .Net 4 , Sql 2008 R2 استفاده میکنم
با تشکر

محمد آشتیانی
سه شنبه 21 بهمن 1393, 12:52 عصر
سلام
اگر شما DataTable داری که هیچ ، در غیر اینصورت این متد یه دیتاتیبل برمیگردونه
* کانکشن استرینگ رو اصلاح کن


private DataTable GetDataTable()
{
SqlConnection con = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=YourTable;Persist Security Info=True;User ID=sa;Password=11111");
SqlCommand cmd = new SqlCommand();
SqlDataReader dr;
DataTable dt = new DataTable();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM tblgroup ORDER BY pid, id";
con.Open();
dr = cmd.ExecuteReader();
dt.Load(dr);
con.Close();
return dt;
}



این متد هم بر اساس دیتا تیبل ، TreeView رو پر میکنه
* اسم TreeView و DataTable رو بعنوان پارامتر باید بهش پاس بدی
** مطلبی که واضحه NewNode.Name = row["ID"].ToString(); نباید تو متد تغییر کنه ، چون گره های Parentاز این طریق پیدا میشن.

private void FetchData(TreeView Tree, DataTable dt)
{
Tree.Nodes.Clear();
foreach (DataRow row in dt.Rows)
{
if (row["PID"].ToString() == string.Empty)
{
TreeNode NewNode = new TreeNode();
NewNode.Name = row["ID"].ToString();
NewNode.Text = row["Title"].ToString();
NewNode.Tag = row["ID"].ToString();

Tree.Nodes.Add(NewNode);
}
else
{
TreeNode[] tn ;
tn = Tree.Nodes.Find(row["PID"].ToString(), true);

TreeNode NewNode = new TreeNode();
NewNode.Name = row["ID"].ToString();
NewNode.Text = row["Title"].ToString();
NewNode.Tag = row["ID"].ToString();

if (!(tn[0] == null))
{
tn[0].Nodes.Add(NewNode);
}
}
}

}



نحوه فراخوانی هم به این شکل میشه


FetchData(treeView1, GetDataTable());


* فقط اسم دیتابیس ، جدول و همچنین فیلد ها رو مجددا کنترل کنید.




موفق باشید

ghasem110deh
سه شنبه 21 بهمن 1393, 15:05 عصر
آقای آشتیانی ، من از این کد استفاده کردم :

treeView1.Nodes.Clear(); SqlConnection connection1 = new SqlConnection("Data Source=.;Initial Catalog=Pooya;Integrated Security=True");
SqlCommand command1 = new SqlCommand("select Cam,Mod,Company,Qual,Price from Tcam");
command1.Connection = connection1;
command1.Connection.Open();
SqlDataReader reader1 = command1.ExecuteReader();
for (int num1 = 0; reader1.Read(); num1++)
{
treeView1.Nodes.Add(reader1[0].ToString());
int num3 = reader1.FieldCount - 1;
for (int num2 = 0; num2 <= num3; num2++)
{
treeView1.Nodes[num1].Nodes.Add(reader1[num2].ToString());
}
}

اما نمیدونم چرا تو بعضی از جداول انتخاب فیلد جواب نمیده !!؟ (عکس ضمیمه)
منظورم : مثلا توی مشخصات دوربین جدول Id, Cod, Pic و ... دیگه هم هست که انتخاب نکردم ؛ اما مشکلی بوجود نیومده
ولی توی مشخصات مشتری بجز * هر چیز دیگه ای بنویسم تری ویو خالیه !
دقیقا همین کد رو مینویسم و با نام جدول و فیلدهای خودش ولی خالیه !؟

fakhravari
چهارشنبه 22 بهمن 1393, 16:17 عصر
private void button1_Click(object sender, EventArgs e) {
try
{
DataSet Ds = DAL.FillDataTable("SELECT ID, Name, FileName,ParentID FROM tree", false);
Ds.WriteXml("tree.xml");
MessageBox.Show("Oki");
}
catch { MessageBox.Show("Eroor"); }
}




private static DataSet D1 = new DataSet();
private void Form1_Load(object sender, EventArgs e)
{
DataSet PrSet = new DataSet();
PrSet.ReadXml(@"tree.xml");
D1 = PrSet;


Load_tree();
}
public void Load_tree()
{
treeView1.Nodes.Clear();
treeView1.ImageList = imageList1;
treeView1.ItemHeight = 30;


foreach (DataRow dr in D1.Tables[0].Rows)
{
if (Convert.ToInt32(dr["ParentID"]) == 0)
{
TreeNode tnParent = new TreeNode();
tnParent.Text = dr["Name"].ToString();
tnParent.Tag = dr["FileName"].ToString();
int value = Convert.ToInt32(dr["ID"].ToString());
tnParent.ImageIndex = 2;
tnParent.SelectedImageIndex = 2;
tnParent.Expand();
treeView1.Nodes.Add(tnParent);
FillChild(tnParent, value);
}
}
}
public int FillChild(TreeNode parent, int ID)
{
var dv = D1.Tables[0].DefaultView;
dv.RowFilter = "ParentID =" + ID;
var newDS = new DataSet();
var newDT = dv.ToTable();
newDS.Tables.Add(newDT);


if (newDS.Tables[0].Rows.Count > 0)
{
foreach (DataRow dr in newDS.Tables[0].Rows)
{
TreeNode child = new TreeNode();
child.Text = dr["Name"].ToString().Trim();
child.Tag = dr["FileName"].ToString();
int temp = Convert.ToInt32(dr["ID"].ToString());
child.ImageIndex = 1;
child.SelectedImageIndex = 1;
child.Collapse();


try
{
parent.NodeFont = new System.Drawing.Font("B Mitra", 11, System.Drawing.FontStyle.Bold);
parent.ForeColor = Color.Black;
}
catch { }


parent.Nodes.Add(child);
FillChild(child, temp);
}
return 0;
}
else
{ return 0; }
}

private static string Adress = ""; private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
listBox1.Items.Clear();
try
{
Adress = treeView1.SelectedNode.Tag.ToString();
if (Adress == "$") return;


if (File.Exists(Adress))
{ pdfDocument1.FilePath = (Adress); }
else { MessageBox.Show("فایل موجود نمی باشد : " + Adress); }


for (int i = 1; i <= pdfDocument1.PageCount - 1; i++)
{
listBox1.Items.Add(i);
}
}
catch { }
}

ghasem110deh
چهارشنبه 22 بهمن 1393, 19:42 عصر
سلام
یه عکس از خروجی میزارین ...
راستی میشه همزمان از دو تا جدول خوند ؟
یعنی نود پدر اسامی انبارها (جدول انبار) رو نشون بده و در نود فرزند کالاها رو (جدول کالا) ---> و زیر مشخصات کالاها !

mostafab2m
جمعه 29 خرداد 1394, 15:17 عصر
آقای Mohammad.Ashtiani (http://barnamenevis.org/member.php?12815-Mohammad-Ashtiani) میشه واسه وب هم راهنمایی کنید