TreeView绑定SQL数据源

合集下载

TreeView後台绑定数据源

TreeView後台绑定数据源

// {
// if (hidNodeId.Value.ToString().IndexOf(treeNode.Value.ToString()) == 0)

// { treeNode.Expand(); }
//}
CreateChildTree(nodeId, fatherNode);
SysFunUpdate.Nodes.Add(fatherNode);
}
////选中的子菜单其父节点打开
//得到第一层节点的显示名称
string displayName = ds.Tables[0].Rows[i]["shopClassname"].ToString();
//根据节点信息创建一层节点
TreeNode fatherNode = CreateTreeNode(displayName, nodeId, "images/up01.gif");
//if (hidNodeId.Value.ToString() != "" && hidNodeId.Value.ToString().Length > 3)
//{
// foreach (TreeNode treeNode in SysFunUpdate.Nodes)
//if (nodeId != "143")
//{
// fatherNode.Target = "";
// fatherNode.NavigateUrl = "DianXinAnli.aspx?ColId=" + nodeId;

C# 递归的应用 TreeView递归绑定数据

C# 递归的应用 TreeView递归绑定数据

递归在WinForm中的应用最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结。

递归热身一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。

如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。

根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。

比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。

这种现象类似于直接递归。

如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。

一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。

初始部分只处理可以直接解决而不需要再次递归调用的简单输入。

递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。

函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。

递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。

如大家熟悉的阶乘函数,我们可以对n!作如下定义:f(n)=1 (n=1)n*f(n-1) (n>=2)一个算法具有的特性之一就是有穷性(Finity):一个算法总是在执行有穷步之后结束,即算法的执行时间是有限的。

递归算法当然也是算法,也满足算法的特性,因此递归不可能无限递归下去,总有一个终止条件。

对该示例,递归的终止条件是n=1. 当n=1是,返回1,不在调用自己本身,递归结束。

class Program{static void Main(string[] args){long result= function(20);Console.WriteLine(result);Console.ReadLine();}static long function(long n){if(n== 1) //算法终止条件{return1;}return n* function(n- 1);}}递归算法通常不是解决问题最有效的计算机程序,因为递归包含函数调用,函数调用需要时空开销。

C#中的treeview绑定数据库(递归算法)

C#中的treeview绑定数据库(递归算法)

C#中的treeview绑定数据库(递归算法)近⽇⾯试的给我两道题⽬,⼀道是IQ测试,第⼆个就是题⽬所⾔总共两个表 department(id int not null primary key,parentid int,name char(50));employee(id int not null foreign key(id) references department(id) ,departmentid,name char(50));实现的代码记录如下using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data.SqlClient;public partial class Default01 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){fill_Tree();}void fill_Tree(){SqlConnection SqlCon = new SqlConnection("server=(local);uid=sa;pwd=sa;database=test");SqlCon.Open();SqlCommand SqlCmd = new SqlCommand("Select id,name from department", SqlCon);SqlDataReader Sdr = SqlCmd.ExecuteReader();SqlCmd.Dispose();string[,] ParentNode = new string[10000, 2];int count = 0;while (Sdr.Read()){ParentNode[count, 0] = Sdr.GetValue(Sdr.GetOrdinal("id")).ToString();ParentNode[count++, 1] = Sdr.GetValue(Sdr.GetOrdinal("name")).ToString();}Sdr.Close();for (int loop = 0; loop < count; loop++){TreeNode root = new TreeNode();root.Text = ParentNode[loop, 1];root.Target = "_blank";root.NavigateUrl = "Default01.aspx";SqlCommand Module_SqlCmd = new SqlCommand("Select name,id from employee where departmentid =" + ParentNode[loop, 0], SqlCon); SqlDataReader Module_Sdr = Module_SqlCmd.ExecuteReader();while (Module_Sdr.Read()){TreeNode child = new TreeNode();child.Text = Module_Sdr.GetValue(Module_Sdr.GetOrdinal("name")).ToString();child.Target = "_blank";child.NavigateUrl = "Default01.aspx";root.ChildNodes.Add(child);}Module_Sdr.Close();TreeView1.Nodes.Add(root);}TreeView1.CollapseAll();SqlCon.Close();}protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) {}}。

wpf之TreeView绑定

wpf之TreeView绑定

wpf之TreeView绑定wpf绑定TreeView,貌似⽐winForm可能要⿇烦⼀些,不过仔细分析⼀下,还是很好解决的,最近做了⼀个项⽬,正好写了⼀下,下⾯把代码贴出来和⼤家分享⼀下先看⼀个简单的绑定View Code//代码绑定TreeView2private void BindTreeView2(){TreeViewItem item1 = new TreeViewItem() { Header = "节点⼀" };TreeViewItem item11 = new TreeViewItem() { Header = "节点1-1" };item11.Items.Add("aaaa");item11.Items.Add("bbbb");item11.Items.Add("cccc");item11.Items.Add("dddd");item1.Items.Add(item11);item1.Items.Add("cccc");item1.Items.Add("dddd");TreeViewItem item2 = new TreeViewItem() { Header = "节点⼆" };item2.Items.Add("aaaa");item2.Items.Add("bbbb");item2.Items.Add("cccc");item2.Items.Add("dddd");treeView2.Items.Add(item1);treeView2.Items.Add(item2);}private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){string dd = treeView2.SelectedItem as string;MessageBox.Show(dd);}然后在看看动态绑定⾸先、需要创建⼀个节点类,包括节点名称,图⽚,内容等,另外为了可以增加⼦节点,在加⼀个泛型IList,类型就是节点类本⾝View Code///<summary>///节点类///</summary>internal class PropertyNodeItem{public string Icon { get; set; }public string EditIcon { get; set; }public string DisplayName { get; set; }public string Name { get; set; }public int id { get; set; }public int parentId{get;set;}public bool IsExpanded { get; set; }public List<PropertyNodeItem> Children { get; set; }public PropertyNodeItem(){Children = new List<PropertyNodeItem>();}}然后从数据库中读取根节点绑定到treeView中View CodeWebDictClassServices.WebDictClass webDict = new WebDictClass();//根节点添加到treeVIew中private void loadTree(){tvProperties.Items.Clear();//加载根节点前先清除Treeview控件项List<PropertyNodeItem> itemList = new List<PropertyNodeItem>();DataTable dt=webDict.GetArticles();DataView dv = dt.DefaultView;dv.RowFilter = " ClassType='3' and ParentId=0 ";PropertyNodeItem node = new PropertyNodeItem(){DisplayName = dv[0].Row["title"].ToString(),Name = dv[0].Row["title"].ToString(),id=Convert.ToInt32(dv[0].Row["id"].ToString()),parentId=Convert.ToInt32(dv[0].Row["ParentId"].ToString()),IsExpanded=true};int id =Convert.ToInt32(dv[0]["id"].ToString());int pid = Convert.ToInt32(dv[0]["ParentId"].ToString());ForeachPropertyNode(node, id);itemList.Add(node);Properties.ItemsSource = itemList;}然后,在 ForeachPropertyNode⽅法中,实现了⽆限极节点View Code//⽆限接循环⼦节点添加到根节点下⾯private void ForeachPropertyNode(PropertyNodeItem node,int pid){DataTable dtDict = webDict.GetArticles();DataView dvDict = dtDict.DefaultView;dvDict.RowFilter = " ClassType='3' and ParentId=" + pid;if (dvDict.Count > 0){foreach (DataRowView view in dvDict){int id = Convert.ToInt32(view["id"].ToString());string name = view["title"].ToString();int parentId = Convert.ToInt32(view["ParentId"].ToString());PropertyNodeItem childNodeItem = new PropertyNodeItem(){DisplayName = name,Name = name,id=id,parentId=parentId,IsExpanded=false};ForeachPropertyNode(childNodeItem, id);node.Children.Add(childNodeItem);}}}如果我们想触发点击节点事件View Code//选中节点事件private void tvProperties_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) {PropertyNodeItem item = Properties.SelectedItem as PropertyNodeItem;string nodeText= ;// MessageBox.Show(nodeText);}前台的xaml⽂件<TreeView Height="264" x:Name="tvProperties" Width="220" SelectedItemChanged="tvProperties_SelectedItemChanged"> <TreeView.ItemContainerStyle><Style TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter></Style></TreeView.ItemContainerStyle><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"><StackPanel Orientation="Horizontal"><Image VerticalAlignment="Center" Source="{Binding Icon}" Width="16" Height="16" Margin="0,0,2,2"></Image><TextBlock VerticalAlignment="Center" Name="nodeName" Text="{Binding DisplayName}"></TextBlock><Image VerticalAlignment="Center" Source="{Binding EditIcon}" Margin="2,0,0,0"></Image><StackPanel.ToolTip><TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="200"></TextBlock></StackPanel.ToolTip></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView>可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从⽽取得相关的值。

C#关于treeview的绑定和右键菜单添加删除子节点

C#关于treeview的绑定和右键菜单添加删除子节点

C#关于treeview的绑定和右键菜单添加删除子节点最近,使用到了winform的treeview控件,在网上看了好多关于treeview控件使用方法的介绍都不全面。

于是我这个菜鸟进行了写了点东西出来,还请高手不要见笑。

自此也就当作是自己学习的一种反省和记录吧,另外朋友们要是不嫌弃的话可以拿去用。

闲话少说,上代码:一、treeview 控件绑定数据库的操作关于数据库的绑定,参考了网上高手们写的demo,别笑话我,哈哈。

代码1 public void AddTree(int ParentID, TreeNode pNode, TreeView productTypeTree)23 {45 string sql = "select category_sn, category_name, parent_sn from st_product_category";67 DataTable dt = DBHelper.ta(sql, 1);89 TreeNode tn1 = new TreeNode();1011 DataView dvTree = new DataView(dt);1213 //过滤ParentID,得到当前的所有子节点1415 dvTree.RowFilter = "[parent_sn] = " + ParentID;1617 foreach (DataRowView Row in dvTree)1819 {2021 if (pNode == null)2223 { //添加根节点2425 tn1.Text = Row["category_name"].T oString();2627 productTypeTree.Nodes.Add(tn1);2829 tn1.ExpandAll();3031AddTree(Int32.Parse(Row["category_sn"].T oString()), tn1, productTypeTree); //再次递归3233 }3435 else3637 { //添加当前节点的子节点3839 TreeNode tn2 = new TreeNode();4041 tn2.Text = Row["category_name"].T oString();4243 pNode.Nodes.Add(tn2);4445 tn1.ExpandAll();4647AddTree(Int32.Parse(Row["category_sn"].T oString()), tn2, productTypeTree); //再次递归4849 }5051 }5253 productTypeTree.ExpandAll();5455 }二、在为treeview 控件添加右键菜单(添加节点,删除节点)在treeview的节点点击事件中添加右键菜单(TreeView1_NodeMouseClick)private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Button != MouseButtons.Right) return;if (e.Node.Level == 0) return;TreeNode currentNode = this.productTypeTree.GetNodeAt(new Point(e.X, e.Y));ContextMenuStrip cms = new ContextMenuStrip();if (currentNode != null){ToolStripMenuItem editAddproduct = new ToolStripMenuItem("添加兄弟节点");ToolStripMenuItem editAddprChildoduct = new ToolStripMenuItem("添加子节点");ToolStripMenuItem editDeleteproduct = new ToolStripMenuItem("删除节点");editAddproduct.Click += new EventHandler(editAddproduct_Click);editAddprChildoduct.Click += new EventHandler(editAddChildProduct_Click);editDeleteproduct.Click += new EventHandler(editDeleteproduct_Click);cms.Items.Add(editAddproduct);cms.Items.Add(editAddprChildoduct);cms.Items.Add(editDeleteproduct);cms.Show(this.productTypeTree, e.X, e.Y);this.productTypeTree.SelectedNode = currentNode;}}三实现右键菜单的点击事件1 添加子节点23 void editAddChildProduct_Click(object sender, EventArgs e)4 {5 TreeNode tn = this.productTypeTree.SelectedNode;6 AddChildNode(tn, "新节点");7 this.productTypeTree.ExpandAll();8 }9 //删除节点10 void editDeleteproduct_Click(object sender, EventArgs e)11 {12 TreeNode treenode = this.productTypeTree.SelectedNode;13 this.DeleteNode(treenode);14 this.productTypeTree.ExpandAll();15 }16 // 添加兄弟节点17 void editAddproduct_Click(object sender, EventArgse)18 {19 TreeNode tn = this.productTypeTree.SelectedNode;20 AddtreeNode(tn, "新节点");21 this.productTypeTree.ExpandAll();22 }2324 //添加兄弟节点25 private void AddtreeNode(TreeNode Node, string NewNodeName)26 {27 TreeNode parentNode = Node.Parent;28 TreeNode newNode = new TreeNode(); newNode.Text = NewNodeName;29 if (parentNode != null)30 {31 if (!parentNode.Nodes.Contains(newNode))32 {33 parentNode.Nodes.Add(newNode);34 }35 else return;36 }37 }38 //添加子节点39 private void AddChildNode(TreeNode tn, string NewChileName)40 {41 TreeNode newChildNode = new TreeNode();42 newChildNode.Text = NewChileName;43 tn.Nodes.Add(newChildNode);44 }4546 //删除节点47 private void DeleteNode(TreeNode treenode)48 {49 if (treenode.Nodes.Count==0) //如果该节点下没有子节点直接删除50 {51 this.productTypeTree.Nodes.Remove(treenode);52 }53 else if (treenode.Nodes.Count>0)//该节点下有节点提示是否全部删除该节点的所有内容54 {55 if ((MessageBox.Show("是否删除该项目下的所有子项?","警告",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning))==D ialogResult.OK)56 {57 this.productTypeTree.Nodes.Remove(treenode);58 }59 }60 }多余的解释我就不写了,详细大家都能够看得懂。

详解TreeView绑定数据库

详解TreeView绑定数据库

详解TreeView绑定数据库很多应⽤要⽤到TreeView来显⽰组织机构,以下演⽰TreeView如何与数据库进⾏绑定。

数据库结构如下(递归现实):id(guid) pid(guid) name18a83618-8751-47ef-91a0-e2dcde42bb71 **公司c775c004-48ed-4664-8b0c-8fd26fea5f4e 18a83618-8751-47ef-91a0-e2dcde42bb71 A部门a43696f0-a906-4b4a-8abf-a01fb7d54daf c775c004-48ed-4664-8b0c-8fd26fea5f4e A部门->1班组0d7fb83a-c056-482e-800b-52e20c74791b c775c004-48ed-4664-8b0c-8fd26fea5f4e A部门->2班组de28685a-aaff-4876-abe1-bb003d17db64 18a83618-8751-47ef-91a0-e2dcde42bb71 B部门绑定到TreeView的最终效果如下图:1、新建⼀个TreeView控件⼆、绑定2.1 传统做法(⾏不通)2.2 正确做法:⾃⼰建⽴⼀个递归的⽅法。

2.2.1 递归其实就是⽅法的重复调⽤,下⾯是我总结的两种⽅法,对于初学者来说不明⽩其中的代码也没关系,直接拷贝下来⽤就可以了。

#region 绑定TreeView/// <summary>/// 绑定TreeView(利⽤TreeNode)/// </summary>/// <param name="p_Node">TreeNode(TreeView的⼀个节点)</param>/// <param name="pid_val">⽗id的值</param>/// <param name="id">数据库 id 字段名</param>/// <param name="pid">数据库⽗id 字段名</param>/// <param name="text">数据库⽂本字段值</param>protected void Bind_Tv(DataTable dt,TreeNode p_Node, string pid_val, string id, string pid, string text){DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据TreeNode tn;//建⽴TreeView的节点(TreeNode),以便将取出的数据添加到节点中//以下为三元运算符,如果⽗id为空,则为构建“⽗id字段 is null”的查询条件,否则构建“⽗id字段=⽗id字段值”的查询条件string filter = string.IsNullOrEmpty(pid_val) ? pid+" is null" : string.Format(pid+"='{0}'", pid_val);dv.RowFilter = filter;//利⽤DataView将数据进⾏筛选,选出相同⽗id值的数据foreach (DataRowView row in dv){tn = new TreeNode();//建⽴⼀个新节点(学名叫:⼀个实例)if (p_Node==null)//如果为根节点{tn.Value = row[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = row[text].ToString();//节点的Text,节点的⽂本显⽰TreeView1.Nodes.Add(tn);//将该节点加⼊到TreeView中Bind_Tv(dt,tn, tn.Value, id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}else//如果不是根节点{tn.Value = row[id].ToString();//节点Value值tn.Text = row[text].ToString();//节点Text值p_Node.ChildNodes.Add(tn);//该节点加⼊到上级节点中Bind_Tv(dt,tn, tn.Value, id, pid, text);//递归}}}/// <summary>/// 绑定TreeView(利⽤TreeNodeCollection)/// </summary>/// <param name="tnc">TreeNodeCollection(TreeView的节点集合)</param>/// <param name="pid_val">⽗id的值</param>/// <param name="id">数据库 id 字段名</param>/// <param name="pid">数据库⽗id 字段名</param>/// <param name="text">数据库⽂本字段值</param>private void Bind_Tv(DataTable dt,TreeNodeCollection tnc, string pid_val, string id, string pid, string text){DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据TreeNode tn;//建⽴TreeView的节点(TreeNode),以便将取出的数据添加到节点中//以下为三元运算符,如果⽗id为空,则为构建“⽗id字段 is null”的查询条件,否则构建“⽗id字段=⽗id字段值”的查询条件string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);dv.RowFilter = filter;//利⽤DataView将数据进⾏筛选,选出相同⽗id值的数据foreach (DataRowView drv in dv){tn = new TreeNode();//建⽴⼀个新节点(学名叫:⼀个实例)tn.Value = drv[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = drv[text].ToString();//节点的Text,节点的⽂本显⽰tnc.Add(tn);//将该节点加⼊到TreeNodeCollection(节点集合)中Bind_Tv(dt, tn.ChildNodes, tn.Value, id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}}#endregion2.2.2 调⽤2.2.3 关于数据—》测试数据(作⽤:模拟⼀个真实的数据库表),这个⽅法的作⽤是建⽴⼀个表,表中有三个字段,分别为id、⽗id、名称,然后往⾥⾯插⼊些数据。

WPF新手之如何将数据绑定到TreeView

WPF新手之如何将数据绑定到TreeView

WPF新⼿之如何将数据绑定到TreeView看过许多例⼦,全是绑定到类的,没⼈说如何绑定到某个对象,偏偏我这个绝对的新⼿就是要绑定到⼀个对象,只能⾃⼰摸索了:⾸先要将数据绑定到容器,有以下⼏个默认条件:①元数据必须包装在List或者ObservableCollection中,后者具有动态更新的功能。

即,如果在程序中更改了ObservableCollection的值,与之绑定的控件会⾃动得到更新。

②待绑定的元数据可以是基本类型,也可以是复杂对象,这样就可以实际像TreeView这样的嵌套显⽰,但对象的每个成员都必须是基本类型,或者是ObservableCollection。

这⼀点我花了⼀天的时间才⾃⼰琢磨出来。

③类中的所有成员变量全部要以get、set设置其访问属性。

⼜花了我⼀天。

举例如下:[c-sharp]1. public class IPConfig2. {3. public IPAddress IP { get; private set; }4. public bool IPUseDHCP { get; private set; }5. //...6. public IPConfig()7. {8. this.IP = IPAddress.None;9. this.IPUseDHCP = false;10. }11. public IPConfig(string IPstr):this()12. {13. try14. {15. this.IP = IPAddress.Parse(IPstr);16. }17. catch (Exception)18. { }19. }20. }21. public class Profile22. {23. public string Name { get; private set; }24. public ObservableCollection<IPConfig> IPC { get; private set; }25. public Profile() {this.IPC = new ObservableCollection<IPConfig>();}26. public Profile( string name )27. {28. = name;29. this.IPC = new ObservableCollection<IPConfig>();30. }31. public Profile(string name, IPConfig ipc)32. {33. = name;34. this.IPC = new ObservableCollection<IPConfig>();35. this.IPC.Add(ipc);36. }37. }38. public ObservableCollection<Profile> _profiles = new ObservableCollection<Profile>();对数据源只要提供{Binding},然后在程序中设置DataContext来实现绑定。

treeview绑定数据库数据7页word

treeview绑定数据库数据7页word

DataSet ds = new DataSet();string str0 = "SELECT lh, lmmc FROM tdlm WHERE (jb = 1) "; OleDbDataAdapter da0 = new OleDbDataAdapter(str0, cn);da0.Fill(ds, "tdlm0 ");int TableRow_Count0 = ds.Tables[ "tdlm0 "].DefaultView.Count;//求出ds中的"tdlm0 "表的总行数for(int i0 = 0; i0 < TableRow_Count0; i0++){DataRow dr0 = ds.Tables[ "tdlm0 "].Rows[i0];TN0 = new TreeNode();TN0.ID = dr0[0].ToString().Trim();TN0.Text = dr0[0].ToString() + dr0[1].ToString();TN0.Target = "main ";TN0.NavigateUrl = "cx1.asp?leimu= " + TN0.ID;TreeView.Nodes.Add(TN0);string str00 = String.Format( "SELECT lh, lmmc FROM tdlm WHERE (jb = 2) AND (sjlh = '{0} ') ", dr0[0].ToString().Trim());OleDbDataAdapter da00 = new OleDbDataAdapter(str00, cn);da00.Fill(ds, "tdlm00 ");int TableRow_Count00 = ds.Tables[ "tdlm00 "].DefaultView.Count;for(int i00 = 0; i00 < TableRow_Count00; i00++){DataRow dr00 = ds.Tables[ "tdlm00 "].Rows[i00];TN00 = new TreeNode();TN00.ID = dr00[0].ToString().Trim();TN00.Text = dr00[0].ToString() + dr00[1].ToString();TN00.Target = "main ";TN00.NavigateUrl = "cx1.asp?leimu= " + TN00.ID;TN0.Nodes.Add(TN00);}ds.Tables[ "tdlm00 "].Clear();}ds.Tables[ "tdlm0 "].Clear();数据库中首先有树的ID列和Text至于你想怎么显示还得看自己灵活运用String相加来显示Text值查看文章C#实现数据库与treeview的绑定并且能够获得所选的节点值2009年06月05日星期五 01:07在网上找了很多例子,现在看来是很浪费时间的,从MSDN上就有一个很好的例子,将这个例子理解了,对treeview绑定数据库就没有什么大的问题了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用TreeView绑定SQL数据源
这里采用了在页面一loading就把数据绑到TreeView的各节点的方式,而不是在展开时再作子节点的绑定,因此在点击父节点时就不会有刷新的感觉了。

呵呵,代码并没优化.......
aspx页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml" >
<head runat="server">
<title>树形节点绑定</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TreeView ID="TreeView1" runat="server">
</asp:TreeView>
</form>
</body>
</html>
.cs文件:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindTree();
}
}
public void BindTree()
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CreativeConnectionString"].Connectio
SqlDataAdapter sda = new SqlDataAdapter("select * from Province", con);
DataSet ds = new DataSet();
sda.Fill(ds, "Province");
TreeNode parentnode;
TreeNode childnode;
TreeNode townnode;
//TreeView1.ShowLines = true;
foreach (DataRow parentrow in ds.Tables["Province"].Rows)
{
//绑定第一层节点
parentnode = new TreeNode(parentrow["ProvinceName"].ToString(), parentrow["ProvinceId"].ToString(), "Images/shareddocuments.gif");
//运行时候先不展开子节点
parentnode.Expanded = false;
TreeView1.Nodes.Add(parentnode);
SqlDataAdapter adapter = new SqlDataAdapter("select * from City where ProvinceId =" + parentrow["ProvinceId"].ToString(), con);
adapter.Fill(ds, "City");
if (ds.Tables["City"].Rows.Count > 0)
{
//绑定第二层节点
foreach (DataRow childrow in ds.Tables["City"].Rows)
{
childnode = new TreeNode(childrow["CityName"].ToString(), childrow["CityId"].ToString(), "Images/dot.gif");
parentnode.ChildNodes.Add(childnode);
SqlDataAdapter adapter2 = new SqlDataAdapter("select townname from town where cityid=" + childrow["CityId"].ToString(),con);
adapter2.Fill(ds, "Town");
childnode.Expanded = false;
if (ds.Tables["Town"].Rows.Count > 0)
{
//绑定第三层节点
foreach (DataRow townrow in ds.Tables["Town"].Rows)
{
townnode = new TreeNode(townrow["townname"].ToString(), townrow["townname"].ToString(), "Images/log.gif");
childnode.ChildNodes.Add(townnode);
} ds.Tables["Town"].Clear();
}
}
ds.Tables["City"].Clear();
}
con.Close();
}
}
建立如下关系
1,Province
ProvinceID int 主键自增ProvinceName varchar(50) 2,City
CityID int 主键自增ProvinceID int 外键CityName varchar(50) 3,Town
Townid int 主键自增Townname varchar(50) Cityid int 外键。

相关文档
最新文档