PDA

View Full Version : آموزش: اتصال treeview به دیتابیس با زیر شاخه های بینهایت



abadanboy
چهارشنبه 18 مهر 1386, 12:19 عصر
خوب دوستان راجب اتصال یه ساختار درختی treeview به دیتابیس خیلی مشکل دارن این سوال رو چندین بار دیدم
سرچ نکردم ببینم کسی جواب داده یا نه
خوب حالا این کد رو می زارم تا یه کمک کوچکی کرده باشم
در مورد کد
کد به این صورت هست که ما یه شاخه اصلی داریم بهد پدر ها که ایدی 0 دارن و بعد هم فرزندان و نوه ها و .....
مزیت این کد اینه که تا بینهایت جلو میره یعنی یه پدر می تونه 10 تا زیر شاخه داشته باشه و یه پدر 100000 تا
امیدوارم که مورد استفاده واقع بشه
فایل ضمیمه شامل کدها

SQL CODE

CREATE TABLE [dbo].[TblGroup] (
[GroupID] [int] IDENTITY (1, 1) NOT NULL ,
[GroupName] [nchar] (100) COLLATE Arabic_CI_AS NULL ,
[GroupFatherID] [int] NULL ,
[GroupLevel] [int] NULL ,
[GroupActivity] [bit] NULL
) ON [PRIMARY]
GO

ASP CODE

<asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" ImageSet="News" ShowLines="true" style="position: static" NodeIndent="10"
>
<ParentNodeStyle Font-Bold="False" />
<HoverNodeStyle Font-Underline="True" />
<SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px" VerticalPadding="0px" />
<NodeStyle Font-Names="Arial" Font-Size="10pt" ForeColor="Black" HorizontalPadding="5px"
NodeSpacing="0px" VerticalPadding="0px" />
<Nodes>
<asp:TreeNode PopulateOnDemand="True" Text="Group News" Value="C" SelectAction="Expand" Expanded="False"></asp:TreeNode>
</Nodes>
</asp:TreeView>

C# CODE

private void FillCustomers(TreeNode parent)
{
DataSet ds = GetDataSet("select * from TblGroup where GroupFatherId=0");
foreach (DataRow row in ds.Tables[0].Rows)
{
TreeNode node = new TreeNode();
node.Text = row["GroupName"].ToString();
node.Value = row["GroupID"].ToString();
node.PopulateOnDemand = true;
node.SelectAction = TreeNodeSelectAction.Expand;

parent.ChildNodes.Add(node);
}
}
private void FillOrders(TreeNode parent)
{
DataSet ds = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + parent.Value + "'");
foreach (DataRow row in ds.Tables[0].Rows)
{
TreeNode node = new TreeNode();
node.Text = row["GroupName"].ToString();
node.Value = row["GroupID"].ToString();
node.NavigateUrl = "ViewN.aspx?id=" + node.Value;
node.Target = "_blank";
DataSet ds1 = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + node.Value + "'");
if (ds1.Tables[0].Rows.Count.Equals(0))
{
node.PopulateOnDemand = false;
}
else
{
node.PopulateOnDemand = true;
node.SelectAction = TreeNodeSelectAction.Select;
}
parent.ChildNodes.Add(node);
}
}
private DataSet GetDataSet(string sql)
{
// string cs = "server={local};Database={cms};Uid='{cms}';pwd='{an dishecms8605}';";
// cs = string.Format(cs, server, db, user, pass);
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}

protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
switch (e.Node.Depth)
{
case 0:
FillCustomers(e.Node);
break;
default:
FillOrders(e.Node);
break;
}
}

abolfazl585
چهارشنبه 18 مهر 1386, 13:18 عصر
دستتون درد نکنه،
فقط خواستم بگم که اگه یه کم دیگه به کد هاتون فشار بیارید میتونید سریعترش کنید.
این روش در رکورد های زیاد باعث کندی سرعت میشه.
بهتره از Select های تودرتو استفاده کنین.
بهر هال خیلی مفیده. ممنون از لطفتون

abadanboy
چهارشنبه 18 مهر 1386, 13:34 عصر
خوب این کد رو من برای گروه های خبری نوشتم که پیش بینی ما نهایتاً تا عمق 3 برای هر خبر بوده و در این ضمینه مشکلی پیش نمیاد حلا هرکی بهینه ترش کرد بزاره ما هم استفاده کنیم

Hossein Bazyan
پنج شنبه 19 مهر 1386, 11:59 صبح
سلام
میشه کد VB ش رو هم بذارید.

ebrahimhoze
پنج شنبه 19 مهر 1386, 18:53 عصر
میشه کد VB هم بزارید

shahab_ksh
پنج شنبه 19 مهر 1386, 19:43 عصر
این هم کد VB



Private Sub FillCustomers(ByVal parent As TreeNode)
Dim ds As DataSet = GetDataSet("select * from TblGroup where GroupFatherId=0")
For Each row As DataRow In ds.Tables(0).Rows
Dim node As New TreeNode()
node.Text = row("GroupName").ToString()
node.Value = row("GroupID").ToString()
node.PopulateOnDemand = True
node.SelectAction = TreeNodeSelectAction.Expand

parent.ChildNodes.Add(node)
Next
End Sub
Private Sub FillOrders(ByVal parent As TreeNode)
Dim ds As DataSet = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + parent.Value + "'")
For Each row As DataRow In ds.Tables(0).Rows
Dim node As New TreeNode()
node.Text = row("GroupName").ToString()
node.Value = row("GroupID").ToString()
node.NavigateUrl = "ViewN.aspx?id=" + node.Value
node.Target = "_blank"
Dim ds1 As DataSet = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + node.Value + "'")
If ds1.Tables(0).Rows.Count.Equals(0) Then
node.PopulateOnDemand = False
Else
node.PopulateOnDemand = True
node.SelectAction = TreeNodeSelectAction.[Select]
End If
parent.ChildNodes.Add(node)
Next
End Sub
Private Function GetDataSet(ByVal sql As String) As DataSet
' string cs = "server={local};Database={cms};Uid='{cms}';pwd='{an dishecms8605}';";
' cs = string.Format(cs, server, db, user, pass);
Dim da As New SqlDataAdapter(sql, cn)
Dim ds As New DataSet()
da.Fill(ds)
Return ds
End Function
Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As TreeNodeEventArgs)
Select Case e.Node.Depth
Case 0
FillCustomers(e.Node)
Exit Select
Case Else
FillOrders(e.Node)
Exit Select
End Select
End Sub

habedijoo
شنبه 28 مهر 1386, 10:32 صبح
با تشکر از زحمتت .
دوست عزیز بهترن و راحت ترین راه اینه که از کنترلهایی استفاده شود که درخت با امکانات بایند شدن رو ساپورت میکنن . خیلی راحت با سه خط میشه درخت رو ساخت . خیلی هم بهینه و سرعت خوب و آژاکسی کار میکنند . مثل تلریک .

abadanboy
شنبه 28 مهر 1386, 12:08 عصر
آقا ما که گفتیم هرکی بهینه ترش رو داره بزاره تا ما هم استفاده کنیم حالا اگه دارین بزارین
درضمن 1 سال پیش من این کد رو نوشتم

delphi77
یک شنبه 29 مهر 1386, 12:15 عصر
با تشکر از زحمتت .
دوست عزیز بهترن و راحت ترین راه اینه که از کنترلهایی استفاده شود که درخت با امکانات بایند شدن رو ساپورت میکنن . خیلی راحت با سه خط میشه درخت رو ساخت . خیلی هم بهینه و سرعت خوب و آژاکسی کار میکنند . مثل تلریک .

خوب راهی که پیشنهاد دادید چطوریه راهنمایی کنید لطفا

abadanboy
دوشنبه 30 مهر 1386, 10:29 صبح
فکر می کنم منظورش استفاده از کامپوننت باشه

delphi77
دوشنبه 30 مهر 1386, 14:55 عصر
خوب کدام کامپوننت

abadanboy
دوشنبه 30 مهر 1386, 15:29 عصر
نمی دونم من از کامپوننت زیاد استفاده نمی کنم و سعی می کنم خودم یه چیزایی واسش بنویسم مثلاً الان دارم سعی می کنم با مقاله آقای راد در مورد Ajax این درختی رو که نوشتم درستش کنم
کامپوننت شاید اسمش تلریک باشه

Hossein Bazyan
دوشنبه 30 مهر 1386, 17:10 عصر
سلام
کد خوبیه اما موقعی که برای من دو مشکل داره نمیدانم برای بقیه هم داره یا خیر؟

با کلیک روی نوه ها پیغام خطای زیر را میدهد .
The ConnectionString property has not been initialized.
Node ها دوبار نوشته میشوند.اگه ممکنه این مشکلات هم رفع شوند.

مرسی

abadanboy
سه شنبه 01 آبان 1386, 10:16 صبح
به این مشکل تا حالا بر نخوردم به این عکس نگاه کن

http://barnamenevis.org/forum/attachment.php?attachmentid=11487&d=1191999456

Hossein Bazyan
سه شنبه 01 آبان 1386, 10:43 صبح
سلام
مرسی مشکلم حل شد .

Hossein Bazyan
سه شنبه 01 آبان 1386, 15:18 عصر
سلام

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

abadanboy
سه شنبه 01 آبان 1386, 17:06 عصر
آره می شه نوشتم کدشو ولی باید رو هاردم بگردم پیدا کنم می زارمش

Hossein Bazyan
سه شنبه 01 آبان 1386, 17:31 عصر
سلام
اگه زودتر امکانش باشه ممنون میشم . خیلی عجله دارم .
مرسی

abadanboy
سه شنبه 01 آبان 1386, 19:15 عصر
آقا من امشب خونه نمی رم ولی چون بدقول نشم اینو امتحان کن انشاالله درست می شه

void Select_Change(Object sender, EventArgs e)
{

Message.Text = TreeView.SelectedNode.Text;

}


اینم تو treeview بزار

OnSelectedNodeChanged="Select_Change"

Hossein Bazyan
سه شنبه 01 آبان 1386, 21:43 عصر
سلام
مرسی از لطف شما اما مشکلی که این کد داره اینه که با کلیک روی هر قسمت از TreeView مقدار موجود در Text آن برگردانده میشه . من میخوام فقط با کلیک روی نوه ها ( نه پدر یا پسر ) مقدار آن برگردانده شود.

abadanboy
چهارشنبه 02 آبان 1386, 09:41 صبح
privatevoid FillCustomers(TreeNode parent)
{
DataSet ds = GetDataSet("select * from TblGroup where GroupFatherId=0");
foreach (DataRow row in ds.Tables[0].Rows)
{
TreeNode node = newTreeNode();
node.Text = row["GroupName"].ToString();
node.Value = row["GroupID"].ToString();
node.PopulateOnDemand = true;
node.SelectAction = TreeNodeSelectAction.Expand;

parent.ChildNodes.Add(node);
}
}


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


<asp:TreeViewID="TreeView1"runat="server"OnTreeNodePopulate="TreeView1_TreeNodePopulate"ImageSet="News"ShowLines="true"style="position: static"NodeIndent="10"OnSelectedNodeChanged="onselect"
>
<ParentNodeStyleFont-Bold="False"/>
<HoverNodeStyleFont-Underline="True"/>
<SelectedNodeStyleFont-Underline="True"HorizontalPadding="0px"VerticalPadding="0px"/>
<NodeStyleFont-Names="Arial"Font-Size="10pt"ForeColor="Black"HorizontalPadding="5px"
NodeSpacing="0px"VerticalPadding="0px"/>
<Nodes>
<asp:TreeNodePopulateOnDemand="True"Text="Group News"Value="C"SelectAction="Expand"Expanded="False"></asp:TreeNode>
</Nodes>
</asp:TreeView>


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


protectedvoid onselect(object sender, EventArgs e)
{
Label1.Text = TreeView1.SelectedNode.Text;
}


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

smhz777
پنج شنبه 03 آبان 1386, 15:45 عصر
سلام به دوستان
من تو این پست با تابع بازگشتی همین کارو کردم فرقش اینه که فقط یکبار به دیتابیس وصل می شید وچون تابع بازگشتی فکرمیکنم درکل سریعتر هم باشه اینم آدرس (http://barnamenevis.org/forum/showthread.php?p=412192)

delphi77
شنبه 05 آبان 1386, 09:32 صبح
من می خواهم روت اصلی همیشه باز باشه

desinger2007
پنج شنبه 22 آذر 1386, 10:59 صبح
با سلام من برنامه شما رو در لوکال خودم تست کردم برنامه خوب و عالی ای بود دستتون درد نکنه تنها نمیدونم به جای db, pass در این خط چه چیزی باید جایگزین کنم چوت از این خط ارور میگیره

cn = string.Format(cn, Server, db , User, pass );

error: The name 'db' does not exist in the current context

ممنون میشم کمکم کنید چون شدیدا نیاز دارم

abadanboy
پنج شنبه 22 آذر 1386, 11:09 صبح
این خطی که گفتی comment شده و برای connection بوده تو از یه connection معمولی استفاده کن

desinger2007
پنج شنبه 22 آذر 1386, 11:55 صبح
این خطی که گفتی comment شده و برای connection بوده تو از یه connection معمولی استفاده کن

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

string cn = "server={NEGARAN-B8D19E9};Database={cms};Uid='{iran}';pwd='{111111} ';";
cn = string.Format(cn, Server,db, User,pass );
که از db , pass ارور گرفت
اگه comment ها رو در نظر نگیریم این خطا ها رو میده

The type or namespace name 'SqlDataAdapter' could not be found (are you missing a using directive or an assembly reference?)

The name 'cn' does not exist in the current context



Line 63: // string cs = "server={local};Database={cms};Uid='{cms}';pwd='{an dishecms8605}';";
Line 64: // cs = string.Format(cs, server, db, user, pass);
Line 65: SqlDataAdapter da = new SqlDataSource(sql, cn);
Line 66:
Line 67: DataSet ds = new DataSet();

abadanboy
پنج شنبه 22 آذر 1386, 12:17 عصر
SqlConnection cn = new SqlConnection();
cn.ConnectionString ="server=(local);uid=Username;pwd=12345678;database= DB-Name";

desinger2007
پنج شنبه 22 آذر 1386, 15:03 عصر
ممنونم ولی از این خط هم error گرفت:

Line 65: SqlConnection cn = new SqlConnection();

The type or namespace name 'SqlConnection' could not be found (are you missing a using directive or an assembly reference?)
من خیلی به این خطا برخورد میکنم معنی آن چی هست؟

merlin_vista
پنج شنبه 22 آذر 1386, 15:58 عصر
دوست عزیز این خطا به خاطر فعال نکردن System.Data هست !!

Using System.Data.SqlClient

desinger2007
شنبه 24 آذر 1386, 13:36 عصر
ممنونم بله این مشکل حل شد ولی حالا این ارور رو میده:
[The best overloaded method match for 'System.Web.UI.WebControls.SqlDataSource.SqlDataSo urce(string, string)' has some invalid arguments

SqlConnection cn = newSqlConnection();
cn.ConnectionString = "server=(Name-B8D19E9);uid=iran;pwd=111111;database=cms";
SqlDataAdapter da = newSqlDataSource(sql, cn);

DataSet ds = newDataSet();
da.Fill(ds);
return ds;

abadanboy
شنبه 24 آذر 1386, 14:55 عصر
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
این درسته نه اونی که تو نوشتی

desinger2007
شنبه 24 آذر 1386, 17:32 عصر
واقعا ممنونم مشکلم کاملا حل شد
اگه بخوام به جای استفاده از دیتابیس از یه فایل xml برای treeview استفاده کنم که وقتی روی هرکدوم از آنها کلیک شه مثلا تصویر و توضیح و مشخصات مثلا کالا ها در یه gridview نمایش داده شه چه کارهایی رو باید انجام بدم؟ من نمونه این رو در یه starterkit ماکروسافت دیدم که سر در نیاوردم

abadanboy
شنبه 24 آذر 1386, 22:06 عصر
باید هر کدوم از اونا رو لینک کنی با ایدی اون و بفرستی به یه صفحه یا یه فریم دیگه و ایدی رو بخونی و اطلاعات مربوطه رو بیاری مثلا
اینطوری بفرست
http://www.your.com/show.aspx?id=22

desinger2007
یک شنبه 25 آذر 1386, 10:41 صبح
این لینک مشکل داشت میشه بیشتر توضیح بدین و اگه دارین یه نمونه کدشو بذارین کلا من دنبال یه مقاله با عنوان رایت کردن روی فایل های xml با شی ای به نام xmlwriter . میخوام توسط یه xmlwriter مقادیر موجود در دیتابیس یا ... رو داخل فایل xml رایت کنم .
وقتی روی هرکدوم از زیر شاخه های tree کلیک شه مثلا تصویر و توضیح و مشخصات کالا ها در یه gridview نمایش داده شه
شما میدونید؟

abadanboy
یک شنبه 25 آذر 1386, 12:14 عصر
یه خورده تلاش کن نوشتنش راحته

این لینک مشکل داشت میشه
ضمناً اون لینک نیست اون مثاله که می تونی لینک هاتو مثل این بسازی

merlin_vista
دوشنبه 03 دی 1386, 18:16 عصر
یک سوال در باب این بحث :
آقا فرض کنید که من یک جدول دارم که نام سایت را میگیره و در یک فیلد ذخیره میکنه و آدرس اون را هم میگیره و در یک فیلد جدا خیره میکنه !!! خوب
حالا من میخواهم به کمک نمایش درختی ( TreeView ) این کینک ها را دسته بندی کنم یعنی لینک های سایتهای خبری بره تو دسته های خبری و .....
در ضمن هر کاربر که ثبت نام میکونه باید بتونه برای خودش دسته بندی کنه و به این دسته ها سایت اضافه کنه و کاری به بقیه نداشته باشه !!
میشه بگید که باید چطوری بنویسم در ضمن نمیخواهم فرزند و نوه از این چیزا داشته باشه همین فکر کنم تا عمق یک باشه !!
بعداً آدرس سایت را در به صورت کوئری استرینگ به یک صفحه ارسال کنم !!!؟؟؟

samane658
پنج شنبه 26 اردیبهشت 1387, 14:10 عصر
سلام مي دونم اين بحث مال خيلي قبل تره، ولي يه سوال از abadanboy دارم.
جنابT من مي خوام رو هر node ‌از اين treeview كليك ميشه يه صفحه ajax باز شه. ميشه كمكم كنيد!!!؟
خودم يه كارايي كردم ولي value رو فقط واسه child ها تونستم بدست بيارم. واسه parent ها value آخرين node‌ رو مي ده.
Thanks And Have a Nice Day

SamStar
سه شنبه 19 آبان 1388, 11:43 صبح
نودهایی که groupfatherid=0 هست select نمیشن . چرا ؟

yekta64
سه شنبه 19 آبان 1388, 12:57 عصر
این هم کد VB



Private Sub FillCustomers(ByVal parent As TreeNode)
Dim ds As DataSet = GetDataSet("select * from TblGroup where GroupFatherId=0")
For Each row As DataRow In ds.Tables(0).Rows
Dim node As New TreeNode()
node.Text = row("GroupName").ToString()
node.Value = row("GroupID").ToString()
node.PopulateOnDemand = True
node.SelectAction = TreeNodeSelectAction.Expand

parent.ChildNodes.Add(node)
Next
End Sub
Private Sub FillOrders(ByVal parent As TreeNode)
Dim ds As DataSet = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + parent.Value + "'")
For Each row As DataRow In ds.Tables(0).Rows
Dim node As New TreeNode()
node.Text = row("GroupName").ToString()
node.Value = row("GroupID").ToString()
node.NavigateUrl = "ViewN.aspx?id=" + node.Value
node.Target = "_blank"
Dim ds1 As DataSet = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + node.Value + "'")
If ds1.Tables(0).Rows.Count.Equals(0) Then
node.PopulateOnDemand = False
Else
node.PopulateOnDemand = True
node.SelectAction = TreeNodeSelectAction.[Select]
End If
parent.ChildNodes.Add(node)
Next
End Sub
Private Function GetDataSet(ByVal sql As String) As DataSet
' string cs = "server={local};Database={cms};Uid='{cms}';pwd='{an dishecms8605}';";
' cs = string.Format(cs, server, db, user, pass);
Dim da As New SqlDataAdapter(sql, cn)
Dim ds As New DataSet()
da.Fill(ds)
Return ds
End Function
Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As TreeNodeEventArgs)
Select Case e.Node.Depth
Case 0
FillCustomers(e.Node)
Exit Select
Case Else
FillOrders(e.Node)
Exit Select
End Select
End Sub


سلام دوست عزیر ممنون بابت کدتون خیلی عالی بود
یه سوال اگه بخواهیم با کلیک روی هر نود Id و ٔRoot یا همون ایدی parent رو بدست بیاریم باید چکار کنیم؟

smrb59
چهارشنبه 20 آبان 1388, 23:54 عصر
من اگه بخوام اون نودی که تو کد اچ تی ام ال دارم رو نداشته باشم دستورات چه جوری باید تغییر کنه ؟

SamStar
پنج شنبه 21 آبان 1388, 19:49 عصر
نودهایی که groupfatherid=0 هست select نمیشن . چرا ؟

کسی با این مشکل روبرو نشده ؟ نمی دونین چه جوری میشه حلش کرد ؟

SamStar
یک شنبه 01 آذر 1388, 16:10 عصر
نودهایی که قابلیت select شدن ندارند توی آدرسشون postback دارند اما نودهای با father=0 ندارند . چرا ؟

آدرسی که توی پراپرتیز نود هایی هست که پدرشان 0 هست اولش javascript:TreeView_PopulateNode داره اما نودهای دیگه که انتخاب میتونن بشن javascript:__doPostBack('..... داره

elnazii
پنج شنبه 07 بهمن 1389, 12:26 عصر
خوب دوستان راجب اتصال یه ساختار درختی treeview به دیتابیس خیلی مشکل دارن این سوال رو چندین بار دیدم
سرچ نکردم ببینم کسی جواب داده یا نه
خوب حالا این کد رو می زارم تا یه کمک کوچکی کرده باشم
در مورد کد
کد به این صورت هست که ما یه شاخه اصلی داریم بهد پدر ها که ایدی 0 دارن و بعد هم فرزندان و نوه ها و .....
مزیت این کد اینه که تا بینهایت جلو میره یعنی یه پدر می تونه 10 تا زیر شاخه داشته باشه و یه پدر 100000 تا
امیدوارم که مورد استفاده واقع بشه
فایل ضمیمه شامل کدها

SQL CODE

CREATE TABLE [dbo].[TblGroup] (
[GroupID] [int] IDENTITY (1, 1) NOT NULL ,
[GroupName] [nchar] (100) COLLATE Arabic_CI_AS NULL ,
[GroupFatherID] [int] NULL ,
[GroupLevel] [int] NULL ,
[GroupActivity] [bit] NULL
) ON [PRIMARY]
GO

ASP CODE

<asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" ImageSet="News" ShowLines="true" style="position: static" NodeIndent="10"
>
<ParentNodeStyle Font-Bold="False" />
<HoverNodeStyle Font-Underline="True" />
<SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px" VerticalPadding="0px" />
<NodeStyle Font-Names="Arial" Font-Size="10pt" ForeColor="Black" HorizontalPadding="5px"
NodeSpacing="0px" VerticalPadding="0px" />
<Nodes>
<asp:TreeNode PopulateOnDemand="True" Text="Group News" Value="C" SelectAction="Expand" Expanded="False"></asp:TreeNode>
</Nodes>
</asp:TreeView>

C# CODE

private void FillCustomers(TreeNode parent)
{
DataSet ds = GetDataSet("select * from TblGroup where GroupFatherId=0");
foreach (DataRow row in ds.Tables[0].Rows)
{
TreeNode node = new TreeNode();
node.Text = row["GroupName"].ToString();
node.Value = row["GroupID"].ToString();
node.PopulateOnDemand = true;
node.SelectAction = TreeNodeSelectAction.Expand;

parent.ChildNodes.Add(node);
}
}
private void FillOrders(TreeNode parent)
{
DataSet ds = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + parent.Value + "'");
foreach (DataRow row in ds.Tables[0].Rows)
{
TreeNode node = new TreeNode();
node.Text = row["GroupName"].ToString();
node.Value = row["GroupID"].ToString();
node.NavigateUrl = "ViewN.aspx?id=" + node.Value;
node.Target = "_blank";
DataSet ds1 = GetDataSet("select GroupName,GroupID from TblGroup where GroupFatherId='" + node.Value + "'");
if (ds1.Tables[0].Rows.Count.Equals(0))
{
node.PopulateOnDemand = false;
}
else
{
node.PopulateOnDemand = true;
node.SelectAction = TreeNodeSelectAction.Select;
}
parent.ChildNodes.Add(node);
}
}
private DataSet GetDataSet(string sql)
{
// string cs = "server={local};Database={cms};Uid='{cms}';pwd='{an dishecms8605}';";
// cs = string.Format(cs, server, db, user, pass);
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}

protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
switch (e.Node.Depth)
{
case 0:
FillCustomers(e.Node);
break;
default:
FillOrders(e.Node);
break;
}
}


با سلام . ممکنه بگید این کد ها رو کجا بنویسیم و کجا فراخوانی کنیم؟:متفکر:
ضمنا برای node.value خطا می گیره(node متدی با نام value نداره)