如何绑定数据到ASPxTreeList
wpf之treelist的实现方法
wpf之treelist的实现方法WPF之TreeList的实现方法WPF(Windows Presentation Foundation)是微软推出的一种用于创建Windows客户端应用程序的框架。
TreeList是WPF中常用的控件之一,它可以展示树形结构的数据,并且具有列表的功能。
本文将介绍如何使用WPF来实现TreeList控件。
一、TreeList的基本概念在开始介绍具体的实现方法之前,我们先了解一下TreeList的基本概念。
TreeList是由TreeView和ListView两个控件组合而成的,它可以同时展示树形结构和列表数据。
TreeList的树形结构是由TreeView来实现的,而列表数据则是由ListView来实现的。
通过TreeList,我们可以方便地展示和操作具有层次结构的数据。
二、创建一个基本的TreeList控件下面我们来演示如何创建一个基本的TreeList控件。
1. 首先,在Visual Studio中创建一个新的WPF应用程序项目。
2. 打开MainWindow.xaml文件,在窗体中添加以下代码:```xml<Grid><wpf:TreeList x:Name="treeList"><wpf:TreeList.Columns><wpf:TreeListColumn Header="Name" Width="150" /> <wpf:TreeListColumn Header="Age" Width="100" /> <wpf:TreeListColumn Header="Gender" Width="100" /></wpf:TreeList.Columns></wpf:TreeList></Grid>```在这段代码中,我们使用了TreeList控件,并定义了三列(Name、Age和Gender)。
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来实现绑定。
DevexpressWinFormTreeList的三种数据绑定方式(DataSource。。。
DevexpressWinFormTreeList的三种数据绑定⽅式(DataSource。
第⼀种:DataSource绑定,这种绑定⽅式需要设置TreeList的ParentFieldName和KeyFieldName两个属性,这⾥需要注意的是KeyFieldName 的值必须是唯⼀的。
代码如下:private void Form1_Load(object sender, EventArgs e){try{//构建⼀个DataTable数据源DataTable table = new DataTable();table.Columns.Add("parentId");table.Columns.Add("Id");table.Columns.Add("parentName");table.Columns.Add("Name");DataRow row = table.NewRow();row["parentId"] = "";row["Id"] = "*";row["Name"] = "所有颜⾊";table.Rows.Add(row);row = table.NewRow();row["parentId"] = "*";row["Id"] = "1";row["Name"] = "红⾊";table.Rows.Add(row);row = table.NewRow();row["parentId"] = "*";row["Id"] = "2";row["Name"] = "黄⾊";table.Rows.Add(row);row = table.NewRow();row["parentId"] = "*";row["Id"] = "3";row["Name"] = "绿⾊";table.Rows.Add(row);row = table.NewRow();row["parentId"] = "1";row["Id"] = "01";row["Name"] = "粉红⾊";table.Rows.Add(row);row = table.NewRow();row["parentId"] = "2";row["Id"] = "02";row["Name"] = "鹅黄⾊";table.Rows.Add(row);treeList1.ParentFieldName = "parentId";treeList1.KeyFieldName = "Id";treeList1.DataSource = table;treeList1.ExpandAll();}catch (Exception ex){MessageBox.Show(ex.Message);}}private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e){e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);}private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e){try{SetCheckedChildNodes(e.Node, e.Node.CheckState);SetCheckedParentNodes(e.Node, e.Node.CheckState);}catch (Exception ex){MessageBox.Show(ex.Message);}}///<summary>///设置⼦节点的状态///</summary>///<param name="node"></param>///<param name="check"></param>private void SetCheckedChildNodes(TreeListNode node, CheckState check){for (int i = 0; i < node.Nodes.Count; i++){node.Nodes[i].CheckState = check;SetCheckedChildNodes(node.Nodes[i], check);}}///<summary>///设置⽗节点的状态///</summary>///<param name="node"></param>///<param name="check"></param>private void SetCheckedParentNodes(TreeListNode node, CheckState check){if (node.ParentNode != null){bool b = false;CheckState state;for (int i = 0; i < node.ParentNode.Nodes.Count; i++){state = (CheckState)node.ParentNode.Nodes[i].CheckState;if (!check.Equals(state)){b = !b;break;}}node.ParentNode.CheckState = b ? CheckState.Checked : check;SetCheckedParentNodes(node.ParentNode, check);}}运⾏效果图:第⼆种:AppendNode添加节点代码如下:private void LoadTree(){//清空节点treeList1.BeginUnboundLoad();treeList1.ClearNodes();arrayList = new List<TreeListNode>();//绑定部位树树的第⼀层TreeListNode Node = treeList1.Nodes.Add(new object[] { "所有颜⾊", "*"});Node.Tag = "*";arrayList.Add(Node);//绑定第⼆层DataSet ds = SqlHelper.Query(@"select ctc.colorId as ParentNodeID,ctc.childcolorId as NodeID, s as NodeNamefrom C_colorTocolor ctc(nolock)inner join C_color cc(nolock) on ctc.childcolorId=cc.id");if (ds != null && ds.Tables.Count > 0){table = ds.Tables[0];DataRow[] rows = table.Select("ParentNodeID='*'");foreach (DataRow row in rows){TreeListNode tn = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString() }, Node.Id); tn.Tag = row["NodeID"].ToString();arrayList.Add(tn);BindNode(row["NodeID"].ToString(), tn);}}treeList1.EndUnboundLoad();treeList1.ExpandAll();}private void BindNode(string nodeId, TreeListNode tn){DataRow[] rows = table.Select("ParentNodeID='" + nodeId + "'");foreach (DataRow row in rows){TreeListNode tns = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString()}, tn.Id);tns.Tag = row["NodeID"].ToString();arrayList.Add(tns);BindNode(row["NodeID"].ToString(), tns);}}private void Form2_Load(object sender, EventArgs e){//绑定树LoadTree();}运⾏效果图:第三种:VirtualTreeGetChildNodes虚拟树加载。
treelist 用法 express
treelist 用法 expressTreelist是一种常用的数据结构,它被广泛应用于计算机科学和软件工程领域。
本文将介绍Treelist的用法和表达方式。
Treelist的基本概念Treelist是一种组织数据的树状结构,它由节点组成,每个节点都可以包含子节点。
节点之间通过边连接,形成一棵树。
Treelist常用于存储和操作层次结构的数据,如文件系统、组织架构等。
Treelist的创建和初始化Treelist的创建通常需要调用一个构造函数,并传递相关参数。
在创建Treelist之后,需要进行初始化操作,以便添加或删除节点。
Treelist的节点操作Treelist的节点操作是对树进行修改的关键部分。
常见的节点操作包括:1. 添加节点:通过调用相应的方法,可以向Treelist中添加一个新节点。
这个新节点可以作为根节点或现有节点的子节点。
2. 删除节点:通过调用相应的方法,可以删除Treelist中的一个节点及其所有子节点。
3. 查找节点:通过调用相应的方法,并提供一些关键信息,可以在Treelist中查找特定的节点。
4. 更新节点:通过调用相应的方法,可以更新Treelist中节点的值或属性。
Treelist的遍历Treelist的遍历是用来访问所有节点的过程。
常见的遍历方式有:1. 先序遍历:从根节点开始,按照先访问根节点,然后访问左子树,最后访问右子树的顺序进行遍历。
2. 中序遍历:从根节点开始,按照先访问左子树,然后访问根节点,最后访问右子树的顺序进行遍历。
3. 后序遍历:从根节点开始,按照先访问左子树,然后访问右子树,最后访问根节点的顺序进行遍历。
Treelist的应用场景Treelist的应用场景广泛,下面列举了一些典型的应用场景:1. 文件系统:Treelist可以用来表示文件和文件夹的层次结构,方便文件的管理和查找。
2. 组织架构:Treelist可以用来表示组织内各个部门和员工之间的层次关系,便于管理和沟通。
C# 给TreeView控件绑定数据(ASP可作参考)
C# 给TreeView控件绑定数据(可作参考)本文采用的方法是使用一层for循环给treeview控件绑定数据!C# TreeView控件绑定数据在实际的开发过程中,有时候也会需要用到TreeView这个控件,用到这个控件的时候一般情况下都是与数据库离得数据配合使用的也就是将从数据库读取到的数据绑定到TreeView 控件上。
刚开始接触到这个控件的时候我也不知道如何绑定数据,在网上查了下,都是使用循环来绑定数据的,而且是两层循环。
找了个例子看了一下觉得使用两层循环有点繁琐,于是就自己动手试了下,使用一层循环来绑定数据,完全可以达到目的。
一般情况下TreeView都有1到多个根节点,而每个根节点都有0到多个子节点,这样的数据读取就会涉及到两张表或多张表,所以就需要联表查询。
在联表查询的时候,不同的查询方式肯定对查询的结果有所影响。
我所使用的是LEFT JOIN(左联)查询方式。
先看下最终的效果图:下面简单说下我的思路。
本次的例子涉及到两张表,分别是:A表:CREATETABLE A(aId INTPRIMARY KEY,aName V ARCHAR(30),)A表查询结果如下:B表:CREATETABLE B(bId INT,aId INT ,bName V ARCHAR(30),)B表查询结果如下:很显然,这两张表是有主外键关联的对这两张表联接查询,查询语句如下:SELECTA.aName '分组名称',B.bName '姓名'FROMALEFTJOINBONaId =B.aId查询结果如下:在绑定数据的时候会以A表中的aName这个字段作为TreeView的根节点,以B表中的bName作为子节点。
绑定后的结果如下:从联表查询的结果图来看,其中第四分组和第六分组后面的数据是NULL,也就是没有数据,但是在A表中这两条数据时存在的,所以在绑定数据的时候,在TreeView中的这两个根节点也是存在的,但是这两个根节点都没有子节点。
treelist树形控件
treelist树形控件最近项目中要求用dev 控件的treelist 树形控件。
如下图要求如下:1:选择父节点后,子节点全部打钩;2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。
具体实现如下:一、treelist绑定的数据源是数据集(dateset)中的表,而且必须给:(当前节点id)KeyFieldName 和(上一级节点id)ParentFieldName 两个属性绑定字段。
二、设置treelist1(名称)中OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。
三、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。
四、代码1private void treeList1_AfterCheckNode(object sender, DevExpress.X13 CheckNode(e.Node);14 }15 ValidParentIsChecked(e.Node);16 }17else if (e.Node.CheckState == CheckState.Unchecked) 18 { 19if (e.Node.HasChildren)20 {21 ClearNode(e.Node);22 }23//从根节点往下查询是否有打钩的子节点,如果有那么父节点的半选状态不变否则变为不选择状态24 ValidParentNodeIsCanleSel(e.Node);25 }26 }27代码1private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNod 代码//////private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node){if (node.ParentNode != null){if(node.ParentNode.CheckState!=CheckState.Checked)node.ParentNode.CheckState = CheckState.Indeterminate; ValidParentIsChecked(node.ParentNode);}}代码private voidValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes. TreeListNode node){bool isSel = false;if (node.ParentNode != null){if (node.ParentNode.CheckState == CheckState.Indeterm inate){//如果父节点的状态为半选状态这更具父节点判断子节点是否打钩isSel = ValidIsHasCheckChildNode(node.ParentNode);if (isSel == false){//如果所有的子节点都没有“选中”那么父节点的状态变为非选中状态node.ParentNode.CheckState = CheckState.Unche cked;}}ValidParentNodeIsCanleSel(node.ParentNode);}}//////判断子节点是否有状态为“选中”状态/// true 表示有 false 表示为没有///。
TreeView树形控件递归绑定数据库里的数据
TreeView树形控件递归绑定数据库⾥的数据TreeView树形控件递归绑定数据库⾥的数据。
第⼀种:性能不好第⼀步:数据库中查出来的表,字段名分别为UNAME(显⽰名称),DID(关联数据),UTYPE(类型)第⼆步:前台代码1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="tree.aspx.cs" Inherits="Maticsoft.Web.tree" %>23 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">45 <html xmlns="/1999/xhtml">6 <head runat="server">7 <title></title>8 <script type="text/javascript">9 function show(msg) {10 alert(msg);11 }12 </script>1314 </head>15 <body>1617 <form id="form1" runat="server">18 <div>19 <asp:TreeView ID="treeT" runat="server">20 </asp:TreeView>212223 </div>24 </form>25 </body>26 </html>第三步:后台代码1using System;2using System.Collections.Generic;3using System.Linq;4using System.Web;5using System.Web.UI;6using System.Web.UI.WebControls;7using System.Data;8using System.Data.SqlClient;910namespace Maticsoft.Web11 {12public partial class tree : System.Web.UI.Page13 {14 Maticsoft.BLL.G_USERS bll = new BLL.G_USERS();15 Maticsoft.Model.G_USERS model = new Model.G_USERS();1617protected void Page_Load(object sender, EventArgs e)18 {19//根节点的条件20 BindTree("8");21 }2223#region绑定⽗节点(第⼀级)24private void BindTree(string pid)25 {2627 DataSet ds = bll.GetList("a.status > -1 and utype=" + pid);28if (ds.Tables[0].Rows.Count > 0)29 {30for (int i = 0; i < ds.Tables[0].Rows.Count; i++)31 {32 TreeNode node = new TreeNode();33 node.Text = ds.Tables[0].Rows[i]["uName"].ToString();34 node.Target = ds.Tables[0].Rows[i]["dID"].ToString();35this.treeT.Nodes.Add(node);36 BindNode(node);37 }38 }39 }40#endregion4142#region绑定⼦节点4344#endregion45private void BindNode(TreeNode nd)46 {47 DataSet ds = bll.GetList("a.status>-1 and a.id=er_id and b.fid=" + Convert.ToString(nd.Target) + " order by b.shorder asc "); 48for (int i = 0; i < ds.Tables[0].Rows.Count; i++)49 {50 TreeNode node = new TreeNode();51 node.Text = ds.Tables[0].Rows[i]["uName"].ToString();52 node.Target = ds.Tables[0].Rows[i]["dID"].ToString();53 nd.ChildNodes.Add(node);5455//判断是否到最底层节点56if (ds.Tables[0].Rows[i]["utype"].ToString() != "0")57 {58 BindNode(node);59 }60 }61 }6263646566 }67 }效果功能图:另⼀种⼀步到位:(⼀次把所有数据放在数据集中,后⾯再查询)1using System;2using System.Collections.Generic;3using System.Linq;4using System.Web;5using System.Web.UI;6using System.Web.UI.WebControls;7using System.Data;8using System.Data.SqlClient;9using System.Data.OleDb;10namespace tree11 {12public partial class tree : System.Web.UI.Page13 {14protected void Page_Load(object sender, EventArgs e)15 {16if (!Page.IsPostBack)17 {18 DataSet ds = GetData();19 DataRow[] dr = ds.Tables[0].Select("utype=8");20 TreeNode node = new TreeNode();21 node.Text = dr[0]["UName"].ToString();22 node.Value = dr[0]["ID"].ToString();23this.TreeView1.Nodes.Add(node);24 BindTree(node, dr[0]["DID"].ToString(), ds);25 }26 }2728private void BindTree(TreeNode Nodes, string pid, DataSet ds)29 {30 DataRow[] dr = ds.Tables[0].Select("fid=" + pid, "shorder asc");31if (dr.Length > 0)32 {33for (int i = 0; i < dr.Length; i++)34 {35 TreeNode node = new TreeNode();36 node.Text = dr[i]["UName"].ToString();37 node.Value = dr[i]["ID"].ToString();38 Nodes.ChildNodes.Add(node);39if(dr[i]["utype"].ToString() !="0")40 BindTree(node, dr[i]["DID"].ToString(), ds);41 }42 }43 }4445private DataSet GetData()46 {47 OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationManager.AppSettings["OleDbConnString"]);48 conn.Open();49string osqlstr ="select a.id,a.uname,a.utype,b.id did,b.fid,b.shorder from g_users A,G_DEPT B where a.status>-1 and a.id=er_id "; 5051 OleDbDataAdapter oda = new OleDbDataAdapter(osqlstr, conn);5253 DataSet ods = new DataSet();54 oda.Fill(ods);5556return ods;57 }58 }59 }。
treeselect 绑定方法
treeselect 绑定方法在前端开发中,当需要使用树形结构来展示数据的时候,Treeselect就是一个比较常见的工具,可以方便地实现树形下拉选择框。
Treeselect是一个基于Vue.js的Vue Select 组件,支持本地数据和远程数据的加载以及可自定义模板和搜索功能等。
本文将会介绍Treeselect的绑定方法,它包括三个方面:数据绑定、事件绑定以及属性绑定。
一、数据绑定Treeselect支持两种数据源的绑定:本地数据和远程数据。
1. 本地数据绑定在template中,我们封装树形控件需要的data数据,例如:```vue<template><treeselect :options="options"></treeselect></template><script>export default {data: {options: [{label: 'A', value: 'a', children: [{label: 'A1', value: 'a1'},{label: 'A2', value: 'a2'}]},{label: 'B', value: 'b'},{label: 'C', value: 'c'}]}}</script>```上面的例子中,我们在组件的data中定义了options,options是一个数组,数组内的每个对象代表一个树形节点,包含了label和value属性,并且可以通过children属性来实现树形结构的嵌套。
如果我们需要根据后端返回的数据来动态地生成树形控件,可以通过ajax请求数据并将请求到的数据绑定到Treeselect的options属性中。
ASPxGridView(或ASPxTreeList)动态加载数据源的问题
动态绑定ASPxGridView或ASPxTreeList数据源的刷新问题ASPxGridView或ASPxTreeList在官方Demo中都是利用数据源控件绑定的数据源,这样基本上就可以确定了一个ASPxGridView只能固定的显示一些数据,然而在实际应用中经常有这样的需求,一些表结构类似的数据源想在一个页面展示,根据用户选择来呈现。
例如根据ComboBox的item来选择数据源时,如果把数据源绑定事件写在SelectIndexChanged事件里面,用户点击ComboBox选择不同item会先执行Page_Load事件,然后执行SelectIndexChanged事件,将会显示数据,然后用户点击ASPxGridView内的按钮比如排序、下一页等时,将会只执行Page_Load事件,而Page_Load事件里面没有绑定ASPxGridView,将会导致ASPxGridView没有数据显示。
这是一个比较矛盾的事情,如果绑定事件不在Page_Load里面将会导致点击按钮没有数据,如果放在page_load里面将会使用户选择失效。
当然,还有一个事件是比较可行的,ASPxGridView1_AfterPerformCallback,在页面回发的时候执行。
也就是说在点击ASPxGridView上的按钮后先执行Page_Load事件,然后执行ASPxGridView1_AfterPerformCallback事件,绑定在这个事件里执行,可以保证用户的操作有效。
这时还存在一个问题,就是DataTable的值怎么保存。
执行SelectIndexChanged事件时并不能(也许是我不知道)给AfterPerformCallback传参数,而且ASPxGridView回发的时候并不执行SelectIndexChanged事件,这样DataTable的值就无法更新到ASPxGridView的DataSous中。
考虑用ViewState来进行这个操作。
devexpress treelist的用法 -回复
devexpress treelist的用法-回复DevExpress TreeList是一种用于显示层次结构数据的控件,特别适用于需要展示复杂数据和层次关系的场景。
它提供了丰富的功能和灵活的设置选项,可以帮助开发人员轻松地创建功能强大且易于使用的树形列表。
本文将详细介绍DevExpress TreeList的用法,包括如何创建和绑定数据、设置列、展开和折叠节点、编辑数据等。
第一步:创建DevExpress TreeList控件1. 在Visual Studio中,创建一个新的Windows Forms应用程序项目。
2. 从工具箱中将DevExpress TreeList控件拖放到窗体上。
3. 在窗体的代码文件中,添加对DevExpress组件库的引用。
第二步:绑定数据1. 在TreeList的属性窗口中,找到Data Source属性,点击其右侧的“…”按钮。
2. 弹出的数据绑定对话框中,选择要绑定的数据源类型,如DataSet、DataTable或自定义对象等。
3. 根据选择的数据源类型,配置相应的连接字符串或设置对象。
4. 选择要绑定的数据表或自定义对象,并设置相应的字段。
第三步:设置列1. 在TreeList的属性窗口中,找到Columns集合属性,点击其右侧的“…”按钮。
2. 弹出的列集合编辑器中,点击“添加”按钮来添加新的列。
3. 针对每一列,设置其字段名、显示标题、列宽、数据类型以及其他样式等属性。
4. 可以使用列集合编辑器来调整列的顺序、删除列或编辑列样式等。
第四步:展开和折叠节点1. 通过TreeList的OptionsView属性,可以设置树节点的展开和折叠行为。
2. 设置OptionsView.ShowRoot属性为true,表示显示根节点。
3. 设置OptionsView.ShowChildrenInTreeMode属性为true,表示以树形结构展示子节点。
4. 设置OptionsBehavior.ExpandNodesOnIncrementalSearch属性为true,表示在按键输入时自动展开匹配的节点。
自-TreeView手动绑定数据
注:本人编程不久,网上对treeview手动绑定数据的案例太少,而在做企业开发时数据源控件多半会被禁止,所以手动绑定在某种意义上显得是必须的,而我那会儿也纠结于此,所以现在我在这里发一下牢骚,把自己写的一个方法共享一下,仅供参考,希望对遇到类似问题的朋友提供一丝的灵感,说的这么详细,也希望初学者可以学得更多,更多的是希望大家来为我指错,共同进步功能简介:对于树形目录,需要绑定的无三个东西,点击节点的url,展开节点所要显示的子节点,以及节点的显示文本,我弄出来的这个treeview在点击包含有子节点的父节点的时候实现的是展开节点,也就是说点击父节点不是一个超链接过程数据说明:我用的数据库字段涉及三列,其数据出自一个表,一个是name,用于作为节点的显示文本, parentid和id字段了,如果parentid空,则代表当前列为根目录(更节点),子节点与父节点的对应关系是,子节点的parentid对应父节点的id, id需要唯一标识,以此相关联,当然,如果级联设计成’死循环’,那这个就会出现堆栈溢出了,这个需要避免实现流程(按个人所需进行代码改造):1.获取数据查询出来的数据并处理为一个Dictionary<string, object>用于在前台解析绑定(我写的这个只涉及三列,结合附件查看,总之节点名称必须有,子节点和父节点关联字段必须有,剩下的字段就是点击最内层节点超链接地址所涉及的字段了)Dictionary<string, object>,对于这个,我提前说明一下,结合treeview的数据源是treenode,而treenode添加的子节点数据类型也是treenode,需要找个类似的结构,我就想到了这个,其集合的键是对应节点的文本,其值是object,就可以存Dictionary了,一个Dictionary集合对应一个treenode,数据结构相识了,转换起来就方便了,在使用时,结合treenode,首先遍历Dictionary中的数据,把其键作为所要在treenode节点位置所要显示的文本,其值做一个判断(结合dal58行和62行,100行和104行),判断是否还有子节点getClassBySiteId方法是我写的根据一个站点ID获取所需绑定的数据,童鞋们这里就可以结合自己需要的,借用方法重载之类手段按需灵活更改所要绑定的数据了,我用的返回值是Dictionary<string, object> ,一个泛型的键值对集合,因为treeview的结构类似无限级联,那么除了根节点特殊点,就应该用递归的方式读取子节点,这个就是getClass的工作了,这个方法只因为了实现递归,所以才和getClassBySiteId分离为两个方法,dal的86行的sql语句仅是用于验证参数ID对应的实体是否还有对应的下一级,如果没有,则返回一个null值的Dictionary,如果有,则继续解析.而这个结果用于在95行用户判断,当然这个流程用了递归,对于初学者理解起来可能有些头晕,所以要弄懂这些代码的一个实现流程,就需要弄懂递归了(递归的理论就是方法自己调用自己),大体流程就是这么的那我来详细说明一下,在getClassBySiteId方法用于外部调用,当调用时,返回值里面装用什么用途先不管,在47行,用于一个sql语句的变动,从而在51行根据sql语句处得到我们想要的数据(也可是datareader,datatable等),在55行处开始解析父节点,然后把父节点的ID和父节点所要显示的文本传递个getClass方法,(结合getClass中的代码),如果返回不为空(64行),则代表当前的根节点存在子节点, getClass方法就会返回对应的数据,那么就把节点所要显示的文本(数据库数据)作为键,把getClass的返回值作为值;如果返回值为空(95行),则当前的根节点无子节点,那么就把节点所要显示(数据库数据)的文本作为键,57行这里有个小技巧,.我们的UI层中的treeview被编译过后是一个<table>嵌<div>嵌<A>的形式存在于客户端的页面中,treeview的NavigateUrl属性值就会成为A标签的href的值,而我在集合中准备为NavigateUrl赋值的内容是集合的值,那么我在57行处就可以写html的脚本语言,如javascript等,而我点击最内层的节点是请求的就是url里面的地址了,直接写地址可以,调用javascript函数也可以.总之,点击节点的请求在这里处理完全,而我用的是调用javascript函数把id 传递给javascript,在javascript内部处理id,这个有点山寨webserver的感觉.回到主线上,上面就是treeview根节点所要绑定的数据,现在到了装载子节点的数据环节了, getC lass方法的第一个参数是传递一个父节点的ID,因为我的子节点与父节点相关联是通过parentid实现的,所以这个条件是必须的,而这个name这个当前节点的文本,考虑到访问数据库次数不宜太多,在加上在获取id的时候这个name也能顺便获取,故采用参数传递,在方法体内部,如果对应id下无parentid与之对应,则返回空,这个处理在上文提到过,如果不为空,则,遍历结果集(91行),94行一个递归,如果递归返回值为空,则代表当前id对应的数据库实体不包含子节点,那么应该对相应集合的值做特殊处理(99和100行)如果递归不为空,这递归返回的就是一个集合,数据属于object,则可以成为集合的值(treenode的add方法的参数是treenode, Dictionary的值是Dictionary,以此达到结构显示).其实,主要的两个方法内核处理都一样,在这里结果的处理就不多说了2.把上文处理返回的Dictionary<string, object>转换成treenode,用于添加到treeview中显示出来这个操作最好放在一个独立的的类文件中操作,不主张放到后置代码中,这个讲解过程中会提到,首先用同样地Dictionary<string, object>泛型集合接受dal中的对应方法的返回值(个人觉得这个操作放到bll里面比较合理一些),现在就是一个反读取的方式了,当然,这个treeview对象怎么过来我就不管了,我是把它作为参数传进来的,41行清空treeview节点(个人习惯,可省略),42行处就是为什么这些代码不能放到后置代码中的原因,实验证明, System.Web.UI.Page这个类对这段代码有冲突(不信你把这点代码放到后置代码中,然后把继承关系删了)42行代码处获取的集合(键集合)是为了在下面的集合遍历,这里的45行和46行是对节点的判断,结合上文,如果45行转换的集合对象不为空(47行),则代表的意思就是当前数据对应的节点还有子节点,那么当前节点的显示文本就是其对应的键,和list里面的值对应,就把其值(集合)和其文本传递给getNode0方法,这个方法的作用是解析数据对应的节点对象,第一个参数为节点的对应的子节点’集合’(结合上文),第二个参数是该节点所要显示的文本,借用上面相似的步骤判断,和装载Dictionary<string, object>有很多相似的地方,怎么取值,联想怎么装值的理解就容易多了,这里就不讲解很多了,编程吗,自己想通了才是自己的.对应点击最内层根节点该怎样处理,结合源码中装值过程与取值过程,以及鼠标放到根节点看浏览器左下角提示信息就不难了其实这个过程可以简化很多,可以把dataset解析为Dictionary<string, object>集合的时候直接把dataset直接转换成treenode,但我为了’贯彻’三层思想,以及treenode是前台对象,不宜与数据库操作混杂,所以分开处理,而且这个一半写在后台,一半写在前台还有个好处,如果是数据库数据也需要显示到cs的程序中,也可以代码二次利用.有点复杂,所以想让大众点评一下,看是否有更简洁易懂的方法,也好让我们共同进步发布日期 11 9-6附带的代码是已被成功用到项目中,请灵活修改,如有意见或想法,请在百度留言,或QQ留言本人QQ:282616513数据访问层:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;namespace WebCaptureDAL{public class Tv_datasourcedal{///<summary>///单例///</summary>private static Tv_datasourcedal dal = null;private static Object obj = new Object();private Tv_datasourcedal() { }public static Tv_datasourcedal CreateInstance(){if (dal == null){lock (obj){return dal = new Tv_datasourcedal();}}else{return dal;}}///<summary>///根据站点ID获取文章的类别和ID,由于无限级联///返回值为泛型集合///</summary>///<param name="siteid">站点ID</param>///<returns>可以嵌套自身的泛型集合</returns>public Dictionary<string, object> getClassBySiteId(int siteid){Dictionary<string, object> dic = null;string sql = "select id,[name] from ConntentClass where parentid is null";if (siteid >0){sql += " and SiteID="+siteid;}//根据sql语句获取查询的结果DataSet ds = JIZHI.DBHelper.JIZHIDBHelper.CreateInstance().Query(sql);if (ds != null){dic = new Dictionary<string, object>();foreach (DataRow item in ds.Tables[0].Select()){int id = Convert.ToInt32(item["id"]);Dictionary<string, object> dic1 = getClass(id, item["name"].ToString());if (dic1 == null){string url = "javascript:TreeToshow(" + item["id"].ToString() + ");";dic.Add(item["name"].ToString(), url);}else{dic.Add(item["name"].ToString(), getClass(id,item["name"].ToString()));}}}return dic;}///<summary>///获取文章的类别和ID,由于无限级联///返回值为泛型集合///</summary>///<returns>可以嵌套自身的泛型集合</returns>public Dictionary<string ,object> getAllClass(){return getClassBySiteId(-1);}///<summary>///根据类别id返回子类别相关信息///</summary>///<param name="id">所要查询的类别Id</param>///<param name="name">Id对应的名称</param>///<returns>装载的子类别相关类别信息</returns>public Dictionary<string, object> getClass(int id,string name){Dictionary<string, object> dic = null;string sql = "select id,[name],url from ConntentClass where parentid =@id";DataSet ds = JIZHI.DBHelper.JIZHIDBHelper.CreateInstance().Query(sql, new SqlParameter[] { new SqlParameter("@id", id) });if (ds != null){dic = new Dictionary<string, object>();foreach (DataRow item in ds.Tables[0].Select()){int classid = Convert.ToInt32(item["id"]);Dictionary<string, object>dic1=getClass(classid,item["name"].ToString());if (dic1 == null){//string value = "url:" + item["id"].ToString();// string url = "index.html";\string url = "javascript:TreeToshow("+ item["id"].ToString() + ");";dic.Add(item["name"].ToString(), url);}else{dic.Add(item["name"].ToString(), dic1);}}}return dic;}}}UI层先关代码:using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using WebCaptureDAL;using System.Collections.Generic;namespace WebCaptureUI.WebPageCommon{public class ShowTreeView{private static ShowTreeView stv = null;private ShowTreeView() { }private static Object obj = new Object();public static ShowTreeView CreateInstance(){if (stv == null){lock (obj)return stv = new ShowTreeView();}}else{return stv;}}public void getView(TreeView treeview){treeview.LineImagesFolder = "~/TreePic";Dictionary<string, object> dic = ConentClassDal.CreateInstance().getClass();treeview.Nodes.Clear();List<string> list = dic.Keys.ToList<string>();for (int i = 0; i < list.Count; i++){Dictionary<string, object> dic0 = dic[list[i]] as Dictionary<string, object>;string url = dic[list[i]] as string;if (dic0 != null){treeview.Nodes.Add(getNode0(dic0, list[i]));}else if (url != null){TreeNode node1 = new TreeNode(list[i]);node1.SelectAction = TreeNodeSelectAction.Expand;node1.NavigateUrl = url;treeview.Nodes.Add(node1);}}}public TreeNode getNode0(Dictionary<string, object> dic, string name){TreeNode node0 = new TreeNode(name);node0.SelectAction = TreeNodeSelectAction.Expand;node0.NavigateUrl = "";List<string> list = dic.Keys.ToList<string>();for (int i = 0; i < list.Count; i++){TreeNode node1 = null;string dics0 = dic[list[i]] as string;Dictionary<string, object> dics1= dic[list[i]] as Dictionary<string, object>;if (dics0 != null)node1 = new TreeNode(list[i]);node1.NavigateUrl = dics0;}else if (dics1 != null){node1 = getNode0(dics1, list[i]);node1.SelectAction = TreeNodeSelectAction.Expand;node1.NavigateUrl = "";}if (node1 != null){node0.ChildNodes.Add(node1);}}return node0;}}}。
TreeList两种绑定方式
关于DevExpress的XtraTreeList使用方法总结在最近的工作中,使用到了DevExpress中的XtraTreeList用法,正好借此机会研究一下此控件的应用,现将其应用技巧与大家分享一下。
1、使用XtraTreeList绑定数据(数据格式可以为ArrayList形式)我们实例说明要实现下面样式的窗体:首先,在Run Designer里面添加两个列(columns),设置两列的属性,其中第一列“名称”为string格式,FieldName为Name;第二列“选择”将ColumnEdit属性设置为CheckEdit1,FieldName为IsChecked,设置完毕。
其次可以编写一个类,用来绑定TreeList,针对此TreeList窗体,其类代码设置如下:public class TestTreeList{public TestTreeList(){}//名称字段变量private string m_sName = string.Empty;//选择字段变量private bool m_bIsChecked = false;//子Node节点ID变量private int m_iID = -1;//父Node节点ID变量private int m_iParentID = -1;public int ID{get{return m_iID;}set{m_iID = value;}}public int ParentID{get{return m_iParentID;}set{m_iParentID = value;}}public string Name{get{return m_sName;}set{m_sName = value;}}public bool IsChecked{get{return m_bIsChecked;}set{m_bIsChecked = value;}}}类构造完成,在FormLoad里面借助此类对TreeList进行绑定:private void Form1_Load(object sender, EventArgs e) {ArrayList pList = new ArrayList();TestTreeList p = new TestTreeList(); = "测试1";p.IsChecked = true;p.ID = 1;pList.Add(p);TestTreeList q = new TestTreeList(); = "测试2";q.IsChecked = false;q.ParentID = 1;q.ID = 2;pList.Add(q);this.treeList1.DataSource = pList;this.treeList1.RefreshDataSource();}这样就可以构造出一个简单的TreeList应用方法,程序运行结果可得第一幅图所示。
下拉列表框(dropdownlist)几种绑定数据方式
未绑定状态绑定方式1单击“确信”完成列表项的添加看到default.aspx代码如下:<%@ Page Language="C#" AutoEventWireup="true"CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""><html xmlns="" ><head runat="server"><title>练习1</title></head><body><form id="form1" runat="server"><div> <asp:Button ID="Button1" runat="server" Text="确信" OnClick="Button1_Click" /><asp:DropDownList ID="DropDownList1" runat="server"><asp:ListItem>a</asp:ListItem><asp:ListItem>b</asp:ListItem><asp:ListItem>c</asp:ListItem><asp:ListItem>d</asp:ListItem><asp:ListItem>e</asp:ListItem></asp:DropDownList><br /><br /></div></form></body></html>运行看到:绑定方式2:用Dropdownlist1的items集合的Add方式添加项数据在确信按钮的单击事件中添加如下代码:protected void Button1_Click(object sender, EventArgs e) {this.DropDownList1.Items.Add(new ListItem("11"));this.DropDownList1.Items.Add(new ListItem("22"));this.DropDownList1.Items.Add(new ListItem("33"));this.DropDownList1.Items.Add(new ListItem("44"));this.DropDownList1.Items.Add(new ListItem("55"));}如此default.aspx.cs中的代码如下:using System;using System.Data;using System.Configuration;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;{protected void Page_Load(object sender, EventArgs e){}protected void Button1_Click(object sender, EventArgs e){this.DropDownList1.Items.Add(new ListItem("11"));this.DropDownList1.Items.Add(new ListItem("22"));this.DropDownList1.Items.Add(new ListItem("33"));this.DropDownList1.Items.Add(new ListItem("44"));this.DropDownList1.Items.Add(new ListItem("55"));}}运行并单击“确信”按钮后,发觉列表框中多了11,22,33,44,55:绑定方式3:先引入命名空间using System.collections;后概念一个动态数组:arraylist su=new arraylist();接着用su.Add("aa");给数组添加数据,最后用this.dropdownlist1.datasource=su;this.dropdownlist1.databind();把数组数据绑定到下拉列表框中default.aspx.cs代码变成如下:using System;using System.Data;using System.Configuration;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.Collections;{protected void Page_Load(object sender, EventArgs e){}protected void Button1_Click(object sender, EventArgs e){this.DropDownList1.Items.Add(new ListItem("11"));this.DropDownList1.Items.Add(new ListItem("22"));this.DropDownList1.Items.Add(new ListItem("33"));this.DropDownList1.Items.Add(new ListItem("44"));this.DropDownList1.Items.Add(new ListItem("55"));ArrayList su = new ArrayList();su.Add("aa");su.Add("bb");su.Add("cc");su.Add("dd");su.Add("ee");this.DropDownList1.DataSource = su;this.DropDownList1.DataBind();}}运行并单击“确信”后看到如下:在设计视图中添加一个文本框,实现:当咱们在下拉列表框当选择某个索引项时,立刻在文本框中显示的功能。
Aspx页面绑定数据方法
Aspx上的数据绑定在通常时候,我们查询出的数据,绑定的时候,都需要对数据做一些小处理,有时候还有特殊情况,为了方便,我在这里写几种方法。
在GridView中,常用的方法:这些需要在后台绑定数据源:方法一:<asp:BoundField DataField="NM_ID"HeaderText="ID"/>这种方法方便直接。
是最常用的数据绑定。
方法二:<asp:TemplateFieldHeaderText="ID"><HeaderStyleCssClass="Title_Font Freezing"BorderColor="#92c1f4" BorderWidth="1px" Wrap="false" /> <ItemStyleHorizontalAlign="Center" Width="35px"CssClass="nor" /><ItemTemplate><asp:LinkButton ID="NM_ID "runat="server" Value='<%# Bind("NM_ID") %>' /></asp:LinkButton></ItemTemplate></asp:TemplateField>方法三:<asp:TemplateFieldHeaderText="ID"><ItemTemplate><asp:LinkButtonID="NM_ID "runat="server" Value='<%#Eval("NM_ID") %>' ></asp:LinkButton></ItemTemplate></asp:TemplateField>方法四:<asp:TemplateFieldHeaderText="操作"><ItemTemplate><ahref='javascript:dingw("<%#DataBinder.Eval(Container.DataItem, "NM_ID")%>")'><img alt="" width="16"src="../images/Map-Marker.png" style="border: none; " /></a> </ItemTemplate></asp:TemplateField>方法五:该方法需要引用 <%@Import namespace="System.Data" %>该方法可以调用后台方法对数据处理一下:<%# 方法名( ((DataRowView)Container.DataItem).Row["Name"].ToString(),0, 24) )%>也可以直接绑定:<%#((DataRowView)Container.DataItem).Row["NM_ID"].ToString() %> 该方法,我用的也不熟,在服务器控件用该方法可能报错。
DevExpress控件的treeList完整小案例
DevExpress控件的treeList完整小案例这篇内容对刚接触treeList的程序员来说,会有一定的帮助。
以下会以一个小案例来讲解treeList的一些属性方法及事件这是程序的窗体,frmTableMaintenance为窗体名,而groupControl1是一个分组控件,添加和修改都是用同一个分组,也就是说,不管是添加还是修改,用的都是同一个页面,而button跟随操作的变化而变化首先,加载树,即将数据绑定到treeList中1 ///2 /// 加载树3 ///tl_TableMaintain是treeList的名称///对于绑定数据,treeList有自带的,可以不用自己去递归。
直接指定KeyFieldName(主键),ParentFieldName(父键),以及tag值。
4 ///5 public void LoadTree()6 {7 try8 {9 this.tl_TableMaintain.Nodes.Clear();//清空所有节点,以便重新加载1011 ResultBase _arryTableName = Global.Get("System/GetTableMaintain");1213 if (_arryTableName != null)14 {15 _snList =(List)JsonConvert.DeserializeObject(_arryTableName.Result, typeof(List));//数据源snList ,这里获取数据源的方式可自由定义1617 }18 TreeListNode node =tl_TableMaintain.AppendNode(null, -1);19 node.SetValue(treeListColumn1, "表结构维护");20 LoadTreeCtrl(node, "-1");21 TreeListProperty(tl_TableMaintain);//调用方法,设置属性22 }23 catch (Exception ex)24 {}25 }262728 private void LoadTreeCtrl(TreeListNode pnode, string parentkey)29 {30 try31 {32 int index = 0;33 List dv = _snList.Where(o =>o.parent_key.Trim() == parentkey.Trim()).ToList();//根据父级id获取子节点循环加载34 foreach (erp_dev_table rv in dv)35 {36 TreeListNode node =pnode.TreeList.AppendNode(rv.table_key, pnode);37 node.SetValue(0,rv.table_name_english);38 node.Tag = rv;39 LoadTreeCtrl(node, Command.Instance.Getstring(rv.table_key));40 }41 }42 catch (Exception ex)43 {44 }45 }46474849505152 ///53 /// 设置treeList的属性54 ///55 ///56 private void TreeListProperty(TreeList tl)57 {58 tl.OptionsView.ShowColumns = false;//是否显示选中的行59 tl.OptionsBehavior.Editable = false;//不可编辑60 tl.OptionsView.ShowHorzLines =false;//OptionsView提供对树状列表的显示选项,设置水平线是否显示61 tl.OptionsView.ShowIndicator = false;//节点的指示面板是否显示62 tl.OptionsView.ShowVertLines = false;//垂直线条是否显示63 //设置treeList的折叠样式为+ - 号64 eDefaultLookAndFeel = false;65 eWindowsXPTheme = true;66 tl.OptionsSelection.InvertSelection = true;//聚焦的样式是否只适用于聚焦细胞或所有细胞除了聚焦对象,失去焦点后67 }6869然后,单击或双击树节点时,加载该节点对象的详细信息,如图:如果树里面的节点较多,可以采取查询的方法定位到该节点上。
delphi cxtreelist 用法
delphi cxtreelist 用法Delphi CxTreeList 是一个强大的树状列表控件,用于显示和编辑树形数据。
它提供了丰富的功能和灵活的用法,下面介绍一些常用的用法:1. 数据绑定:可以通过设置 `DataSource` 和 `DataMember` 属性来将数据源与 CxTreeList 绑定。
数据源可以是 TDataSet 或TDataSource 对象,数据成员指定了数据源中的树形结构字段。
然后可以使用 `AppendFromDataSet` 或 `LoadFromDataSet` 方法将数据加载到 CxTreeList 中。
2. 列定义:可以使用 `Columns` 属性来定义需要显示的列,每个列可以设置标题、宽度、对齐方式等属性。
可以通过程序代码添加列,也可以在设计时通过界面添加列。
3. 数据编辑:可以使用 `Options` 属性来控制是否允许编辑,可以设置 `toEditing` 为 True 来启用编辑功能。
编辑时可以通过事件或自定义单元格编辑控件来处理数据变更。
4. 节点操作:可以使用 `Add`、`Insert`、`Delete`、`Expand`、`Collapse` 等方法来对节点进行增删改查操作。
可以使用`FocusedNode` 属性来获取当前选中的节点,通过`SelectedNodes` 属性来获取所有选中的节点。
5. 节点样式:可以使用 `Styles` 属性来定义节点的样式,可以设置节点背景色、前景色、字体等属性。
可以根据节点的数据或状态来动态改变样式。
6. 节点事件:可以通过事件来响应节点的点击、展开、折叠、编辑等操作。
常用的事件有 `OnClick`, `OnDblClick`, `OnEnter`, `OnExpand`, `OnCollapse`, `OnEditing`, `OnEdited` 等。
7. 节点检索:可以使用 `FindNodeByText` 或`FindNodeByData` 方法来查找指定文本或数据的节点。
TreeView数据绑定的方法
•TreeView数据绑定的方法•最近作一个.net程序中涉及到权限的分配和管理,要把分为不同层次的权限从数据库中读出在树形控件TreeView中显示出来。
这里采取的是首先取出数据放在DataTable中,然后在递归查询中根据不同的filter条件得到对应树杈需要的数据。
这里使用类似的行政区划的数据表,数据表为:CREATE TABLE [dbo].[QuHua] ([ID] [int] IDENTITY (1, 1) NOT NULL ,--自增的标记列[NAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,--行政区划的名称[ParentID] [int] NOT NULL --行政区划的上一级区划ID,最高级区划的上一级默认为0) ON [PRIMARY]GO---插入测试数据Insert Into dbo.QuHua (NAME,ParentID) Values ('北京',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('山东',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('河北',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('海淀',1)Insert Into dbo.QuHua (NAME,ParentID) Values ('中关村',4)Insert Into dbo.QuHua (NAME,ParentID) Values ('济宁',2)Insert Into dbo.QuHua (NAME,ParentID) Values ('曲阜',6)Insert Into dbo.QuHua (NAME,ParentID) Values ('济南',2)/// <summary>/// 根据递归查询结果动态生成TreeView/// 由于算法效率问题,不适合数据量的情况/// </summary>private void CreateTreeView(){string connetion = "Data Source=. ;Initial Catalog=MIS_New;Integrated Security=True";using (SqlConnection cn = new SqlConnection(connetion)){cn.Open();SqlDataAdapter da = new SqlDataAdapter("select * from QuHua", cn);DataTable dt = new DataTable();da.Fill(dt);//首先把第一级的行政区划取出生成TreeView的节点//作为递归运算的入口CreateTreeViewRecursive(treeView1.Nodes, dt, 0);}}/// <summary>/// 递归查询/// </summary>/// <param name="nodes">TreeView的节点集合</param>/// <param name="dataSource">数据源</param>/// <param name="parentid">上一级行政区划的标识码</param>private void CreateTreeViewRecursive(TreeNodeCollection nodes,DataTable dataSource,int parentid){string filter;filter = string.Format("parentid={0}", parentid);DataRow[] drarr = dataSource.Select(filter);TreeNode node;foreach (DataRow dr in drarr){node = new TreeNode();node.Text = (string)dr["name"];node.Tag = (int)dr["id"];nodes.Add(node);CreateTreeViewRecursive(node.Nodes,dataSource,(int)node.Tag);}}。
DevExpress入门:TreeList绑定复杂数据类型
DevExpress入门:TreeList绑定复杂数据类型上篇讲了PivotGridControl,有的大湿可能觉得废话多了,还有的说呢官方文档里面已经说得很详细了,这个倒是事实。
但是文档是死的,业务是变幻莫测的,所以我今天还是来分享想下TreeList使用的一些个人经验,那些官方文档官方Demo有的就不多啰嗦了,可能只是一笔带过。
首先先一笔带过下这个TreeList 的简单使用:1.模拟创建一些实体和数据源提供代码。
MenuModelpublic class MenuModel{#region 字段属性private int id;/// <summary>/// Gets or sets the menu ID./// </summary>public int ID{get { return id; }set { id = value; }}private int parentID;/// <summary>/// Gets or sets the parent ID./// </summary>/// <value>The parent ID.</value>public int ParentID{get { return parentID; }set { parentID = value; }}private int orderID;/// <summary>/// Gets or sets the order ID./// </summary>/// <value>The order ID.</value>public int OrderID{get { return orderID; }set { orderID = value; }}private string menuName;/// <summary>/// Gets or sets the name of the menu. /// </summary>/// <value>The name of the menu.</value> public string MenuName{get { return menuName; }set { menuName = value; }}#endregionpublic MenuModel() { }protected MenuModel(MenuModel model){this.id = model.id;this.menuName = model.menuName;this.orderID = model.orderID;this.parentID = model.parentID;}}。
网站后台管理之数据列表绑定、删除和修改
9、下面就演示如何使用aspnetPager分页控件进行分页,分页包括前台代码和后 台代码,开始写代码之前我们需要引用一个外部的dll文件
10、然后在前台写如下代码把需要使用的外部控件在页面中注册,<%@ Register
Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="asp" %>
11、然后写代码对分页控件的样式进行修饰,具体代码如下:
<div style="margin: 10px 0 10px 0; padding-bottom: 10px;"> <webdiyer:AspNetPager Style="font-size: 12px" ID="AspNetPager1" runat="server" CustomInfoClass="formbutton" SubmitButtonText="GO" SubmitButtonClass="formfield" CssClass="formfield" PrevPageText=" 前一页" PageSize="10" NextPageText="下一页" LastPageText="尾页" FirstPageText="首页" ShowInputBox="Always" CustomInfoTextAlign="Center" ShowNavigationToolTip="True" CustomInfoHTML="第 <font color='red'> <b>%CurrentPageIndex% </b> </font>页 共%PageCount% 页 %StartRecordIndex%-%EndRecordIndex%" InputBoxStyle="width:19px" meta:resourceKey="AspNetPager1" Width="506px" ShowCustomInfoSection="Left" OnPageChanged="AspNetPager1_PageChanged" HorizontalAlign="Center" EnableTheming="True" NumericButtonCount="4" Wrap="False"> </webdiyer:AspNetPager> </div>
用DataTable绑定TreeView的方法
⽤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();。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
刚好公司项目中使用DevExpress的控件进行系统开发,在开发过程中遇到各种各样的困难,我总结项目中的经验,力所能及的把经验的点滴为大家呈现。
如有不足之处请各位指点。
其实官网也为大家提供了不少好的例子,都是英文。
TreeList 范例1 :如何绑定数据到ASPxTreeList
数据结构
表名: dpt
dptID int
dptname varchar(100)
dptFatherID int
1.新建一个项目
2.新建一个页面treeListDataBind
3.在左边的菜单中拖出TreeList控件
4.数据绑定
Database db = DatabaseFactory.CreateDatabase();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TreeDataBind();
treeList.ExpandToLevel(2);
}
}
private void TreeDataBind()
{
string Sql="select * from com_Dpt";
DataSet ds= db.ExecuteDataSet(mandType.Text, Sql);
treeList.DataSource =ds.Tables[0];
treeList.KeyFieldName = "dptid";
treeList.ParentFieldName = "dptfatherid";
treeList.DataBind();
}
运行一下。
你可以看到如下效果
DevExpress2011 TreeList 范例2:ASPxTreeList属性设置
1、交替的节点颜色设置
属性—>Styles->AlternationgNode->BackColor
2、网格线与树线条
属性->Settings->GridLines
属性->Settings->ShowTreeLines
3、条件格式
ASPxTreeList允许你对个别数据Cell或者是完整节点设置个性化样式设计,你可以使用HtmlDataCellPrepared or HtmlRowPrepared方法去设置你需要的设置
例如上例中添加
protected void treeList_HtmlDataCellPrepared(object sender,
DevExpress.Web.ASPxTreeList.TreeListHtmlDataCellEventArgs e)
{
if (Object.Equals(e.GetValue("dptname"), "部门1A"))
e.Cell.Font.Bold = true;
}
4、节点
多行选择
1.SettingsSelection.Enabled属性设置为True
2.SettingsSelection.AllowSelectAll属性设置为true
3.SettingsSelection.Recursive 反选属性设置为true
5、数据导出
ASPxTreeList 很容易的使用ASPxTreeListExporter组件导出数据
treeListExporter.WriteRtfToResponse();
treeListExporter.WriteXlsxToResponse();
treeListExporter.WriteXlsToResponse();
treeListExporter.WritePdfToResponse();
6、数据分页
SettingsPager.Mode属性设置为ShowPager.
7、数据统计
AspxTreeList 能使你进行单列或一组节点的计算统计,显示的结果在页脚的单元。
AspxTreeList提供5个嵌入聚集函数(count ,max,min等等)
步骤一把Settings.ShowFooter属性设置为true.
步骤二组页脚显示Settings.ShowGroupFooter属性设置为 true.
<Settings ShowGroupFooter="True"ShowFooter="True"GridLines="Both"/>
<Summary>
<dx:TreeListSummaryItem FieldName="dptname"ShowInColumn=" dptname " SummaryType="Count"/>
</Summary>
如果在代码里写。
private void TreeDataBind()
{
string Sql="select * from com_Dpt";
DataSet ds= db.ExecuteDataSet(mandType.Text, Sql);
treeList.DataSource =ds.Tables[0];
treeList.KeyFieldName = "dptid";
treeList.ParentFieldName = "dptfatherid";
TreeListSummaryItem a = new TreeListSummaryItem();
a.FieldName = "dptName";
a.ShowInColumn = "dptName";
a.SummaryType = DevExpress.Data.SummaryItemType.Count ;
treeList.Summary.Add(a);
treeList.DataBind();
}
DevExpress2011 TreeList 范例3:ASPxTreeList编辑
1、设置编辑、新增删除按钮
2、设置编辑模式
AspxTreeList有如下几种编辑模式:Inline, editForm,EditFormAndDisaplyNode,popupEditForm
3、修改、新增数据
protected void treeList_NodeInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
{
string dptname = e.NewValues["dptname"].ToString() ;
//以下写数据插入语句
e.Cancel = True;
}
protected void treeList_NodeUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
{
String keyId As String = e.Keys(0)
string dptname = e.NewValues["dptname"].ToString() ;
//修改数据
e.Cancel=True;
}。