多种方法进行treeview绑定数据库
- 格式:doc
- 大小:362.00 KB
- 文档页数:92
VB TreeView控件使用详解(2012-06-16 15:08:16)转载▼分类:VB编程笔记标签:it第一小时:学习直接用代码将数据填充到树控件中。
为什么要先学习直接用代码将数据填充到树控件中?因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。
目的:我们要在树控件中建立如下的一个3层级关系水果||__苹果| |__红富士| |__国光||__葡萄|__红提子|__青提子解释:水果包含2种,一种是苹果,一种是葡萄,苹果又包含2种,一种是红富士,一种是国光,葡萄也如此。
在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。
概括如下:爷(只能有一个):水果父(这里有2个):父1:苹果;父2:葡萄子(这里有4个):子1:红富士(父1苹果的子);子2:国光(父1苹果的子);子3:红提子(父2葡萄的子);子4:青提子(父2葡萄的子)1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist如何找到这两个控件?Treeview控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version 6.0"Imagelist控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version 6.0"Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢?原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在ImageList控件中。
2、设置这两个控件的属性首先要讲清楚控件的属性设置有2种,一种是设置这个控件在ACCESS中的属性,比如名称等。
一种是设置这个控件本身的属性。
NET中DataGridView数据绑定方法详解
1.使用数据集进行数据绑定
-创建一个数据集对象,并指定相应的表结构。
-从数据库中填充数据到数据集中。
- 将DataGridView的数据源属性设置为数据集中的表。
- 设置DataGridView的自动列生成属性为True,以自动生成列。
2.使用数据表进行数据绑定
数据表是数据集中的一种结构,它由行和列组成。
使用数据表进行数据绑定的步骤如下:
-创建一个数据表对象,并定义列名称和类型。
-从数据库中填充数据到数据表中。
- 将DataGridView的数据源属性设置为数据表。
3. 使用BindingSource进行数据绑定
- 创建一个BindingSource对象。
- 设置BindingSource的DataSource属性为数据源。
- 将BindingSource绑定到DataGridView的数据源属性上。
4.使用数据绑定源进行数据绑定
-创建一个数据绑定源对象,并指定相应的数据源。
- 将数据绑定源绑定到DataGridView的数据源属性上。
5.自定义数据绑定
如果以上方法无法满足需求,还可以使用自定义数据绑定方法。
自定义数据绑定通常涉及以下几个方面:
- 创建一个数据源类,实现数据源接口,如IList、IBindingList或ICollectionView。
- 创建一个继承自DataGridView的自定义控件。
tkinter treeview 方法Tkinter Treeview 提供了多种方法来操作和管理树状视图的数据和布局,以下是常用的几种方法:1. insert(parent, index, iid=None, **options)插入一条新的数据项到指定的父节点下。
父节点由 parent 参数指定,index 参数指定在父节点下的位置,iid 参数可选,用于指定新数据项的标识符,**options 参数可用于设置其他属性,如文本、图标等。
2. delete(*item)删除指定的数据项。
item 参数可以是一个或多个数据项的标识符,用于指定要删除的项。
3. move(item, parent, index=None)移动指定的数据项到新的父节点下,并指定在新父节点下的位置。
item 参数指定要移动的数据项,parent 参数指定新的父节点,index 参数可选,用于指定在新父节点下的位置。
4. item(item, option=None, **kw)获取或设置指定数据项的属性。
item 参数指定要操作的数据项,option 参数用于指定要获取或设置的属性,kw 参数用于设置属性的值。
5. get_children(item="")获取指定数据项的子节点。
item 参数用于指定要获取子节点的数据项。
6. parent(item)获取指定数据项的父节点。
item 参数用于指定要获取父节点的数据项。
7. selection()获取当前选择的数据项。
返回一个包含选择数据项的列表。
8. selection_add(item)添加一个数据项到当前选择中。
item 参数用于指定要添加的数据项。
9. selection_remove(item)从当前选择中移除一个数据项。
item 参数用于指定要移除的数据项。
10. selection_toggle(item)切换当前选择的状态。
如果指定的数据项已选择,则取消选择;否则选择该数据项。
一、什么是treegridview?treegridview 是一种常用的控件,它是基于 gridview 和 treeview 的组合,可以实现树形结构和表格数据的显示,可以展示出树形结构并具有表格的数据功能。
treegridview 是一种常用的控件,用法灵活,功能强大,可以满足各种复杂的数据展示需求。
二、treegridview 的基本用法1. 控件的引用首先需要引用 treegridview 控件,在项目中添加对 treegridview 的引用,引用方式一般是通过将相关的 DLL 文件添加到项目中,然后在项目的代码文件中添加对 treegridview 控件命名空间的引用。
2. 控件的初始化treegridview 控件的初始化工作一般包括设置控件的基本属性、绑定数据源和设置事件处理程序等。
需要注意的是,treegridview 控件的初始化工作一般是在页面加载事件中完成的,以确保在页面首次加载时能够正确显示数据。
3. 数据绑定treegridview 控件的数据绑定工作一般是通过设置控件的数据源来实现的。
在数据绑定过程中,需要注意确保数据源的结构能够正确地映射到树形结构和表格数据的显示需求。
4. 自定义样式treegridview 控件的样式可以通过设置控件的样式属性来实现。
控件的样式设置一般包括设置表头样式、行样式和单元格样式等。
通过自定义样式,可以使 treegridview 控件在页面中展示出符合项目需求的外观效果。
5. 事件处理treegridview 控件的事件处理工作一般包括设置控件的事件处理程序,并在事件处理程序中编写相应的逻辑代码。
在事件处理过程中,需要注意确保事件处理程序能够正确地响应用户操作,并能够对控件的数据进行相应的处理。
6. 控件的功能扩展treegridview 控件的功能还可以通过扩展控件的自定义列、自定义模板和自定义编辑等功能来实现。
通过扩展控件的功能,可以为项目定制出更符合实际需求的数据展示和操作界面。
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>可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从⽽取得相关的值。
winform中的TreeView的数据绑定#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)//如果为根节点{ = row[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = row[text].ToString();//节点的Text,节点的⽂本显⽰TreeView1.Nodes.Add(tn);//将该节点加⼊到TreeView中Bind_Tv(dt, tn, , id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}else//如果不是根节点{ = row[id].ToString();//节点Value值tn.Text = row[text].ToString();//节点Text值p_Node.Nodes.Add(tn);//该节点加⼊到上级节点中Bind_Tv(dt, tn, , 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();//建⽴⼀个新节点(学名叫:⼀个实例) = drv[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = drv[text].ToString();//节点的Text,节点的⽂本显⽰tnc.Add(tn);//将该节点加⼊到TreeNodeCollection(节点集合)中Bind_Tv(dt, tn.Nodes, , id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}}#endregion绑定代码:Bind_Tv(datatable,TreeView1.Nodes, null, "id字段", "⽗id字段", "名称字段");。
vs2008 c# .net treeview 动态绑定数据库,增加、修改、删除节点1.使用初步(1)下载地址/downloads/samples/internet/default.asp?url=/Downloads/samples/Inter net/ASP_DOT_NET_ServerControls/WebControls/default.asp(2)不显示树型的问题首先:下载包分自动安装和手动安装两种包。
要下载大小约650K 的自动安装包。
其次:TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0(3)关于闪烁将AutoPostBack属性设置为真,SelectedIndexChange才能被执行。
不过这样的话刷新的很厉害。
不要刷新的话,将AutoPostBack属性设置为FALSE.(4)常用的几个属性和方法~Index 获取树节点在树节点集合中的位置。
~Nodes 获取分配给树视图控件的树节点集合。
~Parent 获取或设置控件的父容器。
~SelectedNode 获取或设置当前在树视图控件中选定的树节点。
~ExpandAll 展开所有树节点。
~Checked 获取或设置一个值,用以指示树节点是否处于选中状态。
~Text 获取或设置在树节点标签中显示的文本。
~Expand 展开树节点。
~Clear 清空树~Remove 从树视图控件中移除当前树节点。
(5)常用的几个操作:增加、删除、修改、剪切@增加节点:Dim tmpNd3 As NewMicrosoft.Web.UI.WebControls.TreeNode()Dim NdSel As NewMicrosoft.Web.UI.WebControls.TreeNode()'NdSel 为当前选定的节点,新节点将作为它的子节点NdSel =Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)tmpNd3.Text = "新增节点"'在树中添加这个新节点NdSel.Nodes.Add(tmpNd3)@删除节点:Dim tmpNd3 As NewMicrosoft.Web.UI.WebControls.TreeNode()Dim NdSel As NewMicrosoft.Web.UI.WebControls.TreeNode()'NdSel 为当前选定的要删除节点,tmpNd3为它的父节点NdSel =Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)If (Treepaybasic.SelectedNodeIndex <> "0") ThentmpNd3 = NdSel.ParenttmpNd3.Nodes.Remove(NdSel)ElseTreepaybasic.Nodes.Clear()End If@修改节点:Dim NdSel As NewMicrosoft.Web.UI.WebControls.TreeNode()NdSel =Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)NdSel.Text = "aaa"@剪切和粘贴剪切:Dim tmpNd3 As NewMicrosoft.Web.UI.WebControls.TreeNode()Dim NdSel As NewMicrosoft.Web.UI.WebControls.TreeNode()'NdSel 为当前选定的要删除节点,tmpNd3为它的父节点NdSel =Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)'将剪切下来的节点存入sessionSession("node") = NdSelIf (Treepaybasic.SelectedNodeIndex <> "0") ThentmpNd3 = NdSel.ParenttmpNd3.Nodes.Remove(NdSel)End If粘贴:Dim tmpNd3 As NewMicrosoft.Web.UI.WebControls.TreeNode()Dim NdSel As NewMicrosoft.Web.UI.WebControls.TreeNode()'NdSel 为当前要粘贴节点的父节点NdSel =Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)tmpNd3 = Session("node")NdSel.Nodes.Add(tmpNd3)2.用递归生成树的算法和数据库设计(1)递归说明程序调用自身的编程方法称为递归(recursion)。
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 }多余的解释我就不写了,详细大家都能够看得懂。
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来实现绑定。
⽤DataTable绑定TreeView的⽅法⽤DataTable绑定TreeView的⽅法:1. 从数据库读取含⽗⼦关系列的表并填充到DataSet⾥去2. 创建⼀个关⽩联,并为DataSet添加该关联,DataSet的Nested属性必需为true.3. 取得该DataSet的XML描述,⽤XSLT将XML规则化.4. 绑定TreeView.表的内容描述如下:表名:CATEGORIESCategoryID ParentCategoryID CategoryName213243521.1621.2721.3832.1932.21043.11151.1.11251.1.213103.1.114133.1.1.115143.1.1.1.116143.1.1.1.217143.1.1.1.3填充DataSet//Connection to databaseOleDbConnection objConn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db.mdb") + ";Persist Security Info=False");//SQL query to get data from CATEGORIES tableOleDbCommand objCommand=new OleDbCommand("SELECT * FROM CATEGORIES",objConn);//OleDbDataAdapterOleDbDataAdapter objDa =new OleDbDataAdapter(objCommand);//DataSetDataSet ds=new DataSet("CATEGORIESDS");//Fill DataSetobjDa.Fill(ds ,"CATEGORIES");添加关联//Create DataRelationDataRelation drel=new DataRelation("CATEGORIES_RECURSIVE",ds.Tables["CATEGORIES"].Columns["CategoryID"],ds.Tables["CATEGORIES"].Columns["ParentCategoryID"]);//Make sure relation is nesteddrel.Nested =true;//Add relation to DataSet's Relations collectionds.Relations.Add(drel);XML转换//XmlDocument to hold XML generated from DataSetXmlDocument objDoc=new XmlDocument();//Load XMLobjDoc.LoadXml(ds.GetXml());//Create XslTransform objectXslTransform objXSL=new XslTransform();//Load XSLT stylesheetobjXSL.Load(Server.MapPath("transformationtemplate.xslt"));//StringWriter to temporarily hold result of the transformation StringWriter writer=new StringWriter();//Apply transformation with no arguments and dump results to StringWriter. objXSL.Transform(objDoc.CreateNavigator(),null,writer);绑定TreeView//Set TreeView's TreeNodeSrc property to get XML from StringWriter. TreeView1.TreeNodeSrc =writer.ToString();//Bind TreeViewTreeView1.DataBind();//Close StringWriterwriter.Close();。
TreeView绑定数据库(免费,哥为了大家,费了20个经验值,给个5星吧!)数据库:公司:id(int) company(varchar(50)部门:id(int) deid(int) department(varchar(50))班组:id(int) coid(int) class(varchar(50))前台方法1:DB DBManager = new DB();//实例化数据库操作类string strConn = System.Configuration.ConfigurationManager.Conne ctionStrings["rizhi"].ConnectionString;protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){//TreeView1.Attributes.Add("onclick", "OnTreeNodeChecked() ");TreeView1.Attributes.Add("onclick", "testClick(event);return tr ue;");//单击文字,CheckBox=trueTreeView1.ShowCheckBoxes = TreeNodeTypes.Leaf;//最后一级选中TreeView1.ExpandDepth = 0;//不展开using (SqlConnection conn = new SqlConnection(strConn)){DataSet ds_company = new DataSet();//实例化数据集(公司) SqlDataAdapter sda_company = new SqlDataAdapter("selec t * from [company] where id<>"+0+" and id<>"+1001, conn);//实例化数据适配器(公司)sda_company.Fill(ds_company, "company");//虚拟表填充到内存for (int i = 0; i < ds_company.Tables["company"].Rows.Count; i++)//循环所有"公司"{TreeNode td_company = new TreeNode();//实例化公司节点td_company.Text = ds_company.Tables["company"].Rows [i]["company"].ToString();//公司节点名称TreeView1.Nodes.Add(td_company);//将公司节点添加至"树" td_company.SelectAction = TreeNodeSelectAction.Expand;DataSet ds_department = new DataSet();//实例化数据集(部门)SqlDataAdapter sda_department = new SqlDataAdapter("s elect * from [department] where [coid]=" + ds_company.Tables["compa ny"].Rows[i]["id"]+" and department<>'全公司'" , conn);//实例化数据库适配器(部门)sda_department.Fill(ds_department, "department");//虚拟表填充到内存for (int j = 0; j < ds_department.Tables["department"].Ro ws.Count; j++)//循环 ds.Tables["department"].Rows[i]["id"] 对应的所有部门{TreeNode td_department = new TreeNode();//实例化部门节点td_department.Text = ds_department.Tables["departme nt"].Rows[j]["department"].ToString();//部门节点名称td_company.ChildNodes.Add(td_department);//填充部门节点至"树"td_department.SelectAction = TreeNodeSelectAction.Ex pand;//只允许展开#region如果人员属于某个班组if (DBManager.getDs("select [info] from [user] where [pid]=" + ds_department.Tables["department"].Rows[j]["id"] + "", "is ").Tables["is"].Rows.Count == 0){DataSet ds_class = new DataSet();//实例化数据集(班组) SqlDataAdapter sda_class = new SqlDataAdapter("sel ect * from [class] where [deid]=" + ds_department.Tables["department"].Rows[j]["id"], conn);//实例化数据库适配器(班组)sda_class.Fill(ds_class, "class");//虚拟表填充到内存for (int z = 0; z < ds_class.Tables["class"].Rows.Coun t; z++)//循环 ds_department.Tables["class"].Rows[j]["id"] 对应的所有班组 {TreeNode td_class = new TreeNode();//实例化班组节点td_class.Text = ds_class.Tables["class"].Rows[z][" class"].ToString();//班组节点名称td_department.ChildNodes.Add(td_class);//填充班组节点至"树"td_class.SelectAction = TreeNodeSelectAction.Expa nd;//只允许展开DataSet ds_user = new DataSet();//实例化数据集(人员)SqlDataAdapter sda_user = new SqlDataAdapter("s elect [name] from [user] where [pid]=" + ds_class.Tables["class"].Rows [z]["id"] + "", conn);////实例化数据库适配器(人员)sda_user.Fill(ds_user, "user");//虚拟表填充到内存for (int k = 0; k < ds_user.Tables["user"].Rows.Co unt; k++)//循环 ds_department.Tables["user"].Rows[k]["name"] 对应的所有人员{TreeNode td_user = new TreeNode();//实例化班组节点td_user.Text = ds_user.Tables["user"].Rows[k] ["name"].ToString();//人员节点名称td_class.ChildNodes.Add(td_user);//填充人员节点至"树"td_user.NavigateUrl = "javascript:void(0)";//选中,但无效}}}#endregion#region如果人员直接属于某个部门else{DataSet ds_user = new DataSet();SqlDataAdapter sda_user = new SqlDataAdapter("sel ect [name] from [user] where [pid]=" + ds_department.Tables["depart ment"].Rows[j]["id"] + "", conn);sda_user.Fill(ds_user, "user");for (int k = 0; k < ds_user.Tables["user"].Rows.Coun t; k++){TreeNode td_user = new TreeNode();td_user.Text = ds_user.Tables["user"].Rows[k]["n ame"].ToString();td_department.ChildNodes.Add(td_user);td_user.NavigateUrl = "javascript:void(0)";}}#endregion}}}}}方法2:string strConn = System.Configuration.ConfigurationManager.Conne ctionStrings["rizhi"].ConnectionString;protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){DataSet ds = new DataSet();SqlConnection conn = new SqlConnection(strConn);using (conn){SqlDataAdapter sda_Company = new SqlDataAdapter("selec t [id],[company] from [company]", conn);sda_Company.Fill(ds, "company");TreeNode tn_Company;TreeNode tn_Department;TreeNode tn_Class;foreach (DataRow company_row in ds.Tables["company"].Ro ws){tn_Company = new TreeNode();tn_Company.Text = company_row["company"].ToString(); tn_Company.Value = company_row["id"].ToString();TreeView1.Nodes.Add(tn_Company);SqlDataAdapter sda_Department = new SqlDataAdapter(" select [id],[department] from [department] where coid=" + tn_Company. Value, conn);sda_Department.Fill(ds, "department");if (ds.Tables["department"].Rows.Count > 0){foreach (DataRow department_row in ds.Tables["depart ment"].Rows){tn_Department = new TreeNode();tn_Department.Text = department_row["department "].ToString();tn_Department.Value = department_row["id"].ToStri ng();tn_Company.ChildNodes.Add(tn_Department);SqlDataAdapter sda_Class = new SqlDataAdapter("sel ect [id],[class] from [class] where deid=" + tn_Department.Value, conn); sda_Class.Fill(ds, "class");if (ds.Tables["class"].Rows.Count > 0){foreach (DataRow class_row in ds.Tables["class"]. Rows){tn_Class = new TreeNode();tn_Class.Text = class_row["class"].ToString();tn_Class.Value = class_row["id"].ToString();tn_Department.ChildNodes.Add(tn_Class);}ds.Tables["class"].Clear();}sda_Class.Dispose();}ds.Tables["department"].Clear();}sda_Department.Dispose();}sda_Company.Dispose();}}}方法3:public void bindTv(){ds = new DataSet();using (SqlConnection conn = new SqlConnection(strConn)){conn.Open();SqlDataAdapter sda = new SqlDataAdapter("select * from [class]", co nn);sda.Fill(ds);}AddTree(101, (TreeNode)null);}public void AddTree(int ParentID,TreeNode pNode){DataView dvTree = new DataView(ds.Tables[0]);string Fstr = "[deid]=" + ParentID;dvTree.RowFilter = Fstr;foreach (DataRowView Row in dvTree){TreeNode Node = new TreeNode();if (pNode == null){Node.Value = Row["id"].ToString();Node.Text = Row["class"].ToString();TreeView1.Nodes.Add(Node);AddTree(Int32.Parse(Row["id"].ToString()), Node);}else{Node.Value = Row["id"].ToString();Node.Text = Row["class"].ToString();pNode.ChildNodes.Add(Node);AddTree(Int32.Parse(Row["id"].ToString()), Node);}}}TreeView控件要求绑定到xml数据源上,所以必须设法把数据库中的内存转成xml文件,然后再进行绑定。