TreeView 控件应用实例将 TreeView 绑定到 Biblio.mdb 数据库

合集下载

(C#)TreeView控件综合实例

(C#)TreeView控件综合实例

(C#)TreeView控件综合实例利⽤TreeView控件,建⽴⼀颗树。

程序带有保存⽂本和⼆进制的功能。

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using System.Text.RegularExpressions;using System.Runtime.Serialization.Formatters.Binary;// 知识点:// TreeView控件的应⽤:添加、修改、删除节点// 得到当前节点、⽗节点的值// 响应节点选择事件// 节点存储数据namespace Ch0602_学⽣成绩_⼆进制⽂件_{public partial class FrmGrade : Form{public FrmGrade(){InitializeComponent();}private void btnAddSC_Click(object sender, EventArgs e){if (cboType.SelectedIndex == 0){// 添加学校节点,并指定该节点为当前节点if (txtNameSC.Text.Length > 0){TreeNode node = tvSC.Nodes.Add(txtNameSC.Text);tvSC.SelectedNode = node;}elseMessageBox.Show("请指定学校的名称");}else{if (tvSC.SelectedNode == null || tvSC.SelectedNode.Level >= 1)MessageBox.Show("先选择学校,然后再创建班级节点");else{// 添加班级节点,并展开学校节点if (txtNameSC.Text.Length > 0){tvSC.SelectedNode.Nodes.Add(txtNameSC.Text);tvSC.SelectedNode.Expand();}elseMessageBox.Show("请指定班级的名称");}}}private void btnAddStud_Click(object sender, EventArgs e){if (tvSC.SelectedNode == null || tvSC.SelectedNode.Level != 1){MessageBox.Show("请指定班级");return;}string sname = tvSC.SelectedNode.Parent.Text;string cname = tvSC.SelectedNode.Text;Student stud = new Student(sname, cname);stud.No = txtNo.Text; = txtName.Text;stud.Sex = cboSex.Text;stud.Birth = DateTime.Parse(dtpBirth.Text);stud.Grade = int.Parse(txtGrade.Text);stud.Addr = txtAddr.Text;TreeNode node = tvSC.SelectedNode.Nodes.Add(stud.No);// 给添加的节点绑定数据node.Tag = stud;// 展开班级节点tvSC.SelectedNode.Expand();}private void tvSC_AfterSelect(object sender, TreeViewEventArgs e){// 显⽰当前节点内容if (tvSC.SelectedNode != null && tvSC.SelectedNode.Level == 2 && tvSC.SelectedNode.Tag != null) {Student stud = (Student)tvSC.SelectedNode.Tag;lboStudent.Items.Add(stud.ToString());txtNo.Text = stud.No;txtName.Text = ;cboSex.Text = stud.Sex;dtpBirth.Text = stud.Birth.ToString();txtGrade.Text = stud.Grade.ToString();txtAddr.Text = stud.Addr;}}private void tvSC_AfterSelect(object sender, TreeViewEventArgs e){// 显⽰当前节点内容if (tvSC.SelectedNode != null && tvSC.SelectedNode.Level == 2 && tvSC.SelectedNode.Tag != null) {Student stud = (Student)tvSC.SelectedNode.Tag;lboStudent.Items.Add(stud.ToString());txtNo.Text = stud.No;txtName.Text = ;cboSex.Text = stud.Sex;dtpBirth.Text = stud.Birth.ToString();txtGrade.Text = stud.Grade.ToString();txtAddr.Text = stud.Addr;}}private void cboType_SelectedIndexChanged(object sender, EventArgs e){txtNameSC.Clear();}private void btnModStud_Click(object sender, EventArgs e){if (tvSC.SelectedNode == null || tvSC.SelectedNode.Level != 2){MessageBox.Show("请指定学⽣");return;}string sname = tvSC.SelectedNode.Parent.Parent.Text;string cname = tvSC.SelectedNode.Parent.Text;Student stud = new Student(sname, cname);stud.No = txtNo.Text; = txtName.Text;stud.Sex = cboSex.Text;stud.Birth = DateTime.Parse(dtpBirth.Text);stud.Grade = int.Parse(txtGrade.Text);stud.Addr = txtAddr.Text;// 修改节点信息tvSC.SelectedNode.Text = stud.No;// 修改节点的绑定数据tvSC.SelectedNode.Tag = stud;}private void btnDelStud_Click(object sender, EventArgs e){// 删除节点数据tvSC.SelectedNode.Remove();}// 读⽂本⽂件,⽣成树结构private void miFileRead_Click(object sender, EventArgs e){// 显⽰打开⽂件对话框OpenFileDialog dlgOpen = new OpenFileDialog();if (dlgOpen.ShowDialog() != DialogResult.OK)return;// 以指定⽂件和编码格式打开⽂件,准备读StreamReader sr = new StreamReader(dlgOpen.FileName, Encoding.Default);tvSC.Nodes.Clear();string pattern = @"\s*,\s*|\s+"; // “\s”表⽰空格,“\s*”表⽰0个或多个空格,“\s+”表⽰1个或多个空格 string sname0 = "", cname0 = "";// 读取⼀⾏⽂本string line;string[] fields;while ((line = sr.ReadLine()) != null){//fields = line.Split(' ', '\t');fields = Regex.Split(line, pattern);string sname = fields[0];string cname = fields[1];Student stud = new Student(sname, cname);stud.No = fields[2]; = fields[3];stud.Sex = fields[4];stud.Birth = Convert.ToDateTime(fields[5]);stud.Grade = int.Parse(fields[6]);stud.Addr = fields[7];// 如果学校名改变了,添加学校节点if (sname != sname0){tvSC.SelectedNode = tvSC.Nodes.Add(sname);sname0 = sname;}// 如果班级名改变了,添加班级节点if (cname != cname0){// 调整当前节点if (tvSC.SelectedNode.Level == 1)tvSC.SelectedNode = tvSC.SelectedNode.Parent;tvSC.SelectedNode = tvSC.SelectedNode.Nodes.Add(cname);cname0 = cname;}// 添加学⽣节点TreeNode node = tvSC.SelectedNode.Nodes.Add(stud.No);node.Tag = stud;}// 关闭⽂件sr.Close();}// 遍历树结构,写⽂本⽂件private void miFileWrite_Click(object sender, EventArgs e){// 显⽰保存⽂件对话框SaveFileDialog dlgSave = new SaveFileDialog();if (dlgSave.ShowDialog() != DialogResult.OK)return;// 指定⽂件和编码格式打开指定⽂件准备写StreamWriter sw = new StreamWriter(dlgSave.FileName, false, Encoding.Default);// 遍历树结构,写⽂本⽂件WriteTxtFile(sw, tvSC.Nodes);// 关闭⽂件sw.Close();}// ⽤递归遍历⼀棵树所有节点private void WriteTxtFile(StreamWriter sw, TreeNodeCollection nodes){foreach (TreeNode node in nodes){if (node.Level == 2){Student stud = node.Tag as Student;string line = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5:yyyy-MM-dd}\t{6}\t{7}",stud.Sname, ame, stud.No, , stud.Sex, stud.Birth, stud.Grade, stud.Addr); sw.WriteLine(line);}if (node.Nodes.Count > 0)WriteTxtFile(sw, node.Nodes);}}private void miFileReadBin_Click(object sender, EventArgs e){OpenFileDialog dlgOpen = new OpenFileDialog();if (dlgOpen.ShowDialog() != DialogResult.OK)return;FileStream fs = new FileStream(dlgOpen.FileName, FileMode.Open, FileAccess.Read);tvSC.Nodes.Clear();// 建⽴⼀个读流的类brBinaryReader br = new BinaryReader(fs);// 初始化变量string sname0 = "", cname0 = "";// ⽂件指针指向⽂件头br.BaseStream.Seek(0, SeekOrigin.Begin);// 循环读,直到⽂件指针指向⽂件尾while (br.BaseStream.Position < br.BaseStream.Length){// 按字段读出每个学⽣的记录Student stud = new Student();stud.Sname = br.ReadString();ame = br.ReadString();stud.No = br.ReadString(); = br.ReadString();stud.Sex = br.ReadString();stud.Birth = Convert.ToDateTime(br.ReadString());stud.Grade = br.ReadInt32();stud.Addr = br.ReadString();// 添加到树形节点// 如果学校名改变了,添加学校节点if (stud.Sname != sname0){tvSC.SelectedNode = tvSC.Nodes.Add(stud.Sname);sname0 = stud.Sname;}// 如果班级名改变了,添加班级节点if (ame != cname0){// 调整当前节点if (tvSC.SelectedNode.Level == 1)tvSC.SelectedNode = tvSC.SelectedNode.Parent;tvSC.SelectedNode = tvSC.SelectedNode.Nodes.Add(ame);cname0 = ame;}// 添加学⽣节点TreeNode node = tvSC.SelectedNode.Nodes.Add(stud.No);node.Tag = stud;}br.Close();fs.Close();}private void miFileWriteBin_Click(object sender, EventArgs e){// 显⽰保存⽂件对话框SaveFileDialog dlgSave = new SaveFileDialog();if (dlgSave.ShowDialog() != DialogResult.OK)return;// 建⽴⼀个写⽂件流fsFileStream fs = new FileStream(dlgSave.FileName, FileMode.Create, FileAccess.Write); // 建⽴⼀个写流的类bwBinaryWriter bw = new BinaryWriter(fs);// 遍历树结构,写⽂本⽂件WriteBinFile(bw, tvSC.Nodes);// 关闭写流类和⽂件流bw.Close();fs.Close();}// ⽤递归遍历⼀棵树所有节点private void WriteBinFile(BinaryWriter bw, TreeNodeCollection nodes){foreach (TreeNode node in nodes){if (node.Level == 2){Student stud = node.Tag as Student;bw.Write(stud.Sname);bw.Write(ame);bw.Write(stud.No);bw.Write();bw.Write(stud.Sex);bw.Write(stud.Birth.ToString("yyyy-MM-dd"));bw.Write(stud.Grade);bw.Write(stud.Addr);}if (node.Nodes.Count > 0)WriteBinFile(bw, node.Nodes);}}private void miFileReadBin2_Click(object sender, EventArgs e){OpenFileDialog dlgOpen = new OpenFileDialog();if (dlgOpen.ShowDialog() != DialogResult.OK)return;FileStream fs = new FileStream(dlgOpen.FileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs);tvSC.Nodes.Clear();// 初始化变量string sname0 = "", cname0 = "";// ⽂件指针指向⽂件头fs.Seek(0, SeekOrigin.Begin);// 循环读,直到⽂件指针指向⽂件尾while (fs.Position < fs.Length){// 按字段读出每个学⽣的记录int length = br.ReadInt32();byte[] buffer = new byte[length];buffer = br.ReadBytes(length);Student stud = (Student)BytesToObject(buffer);// 添加到树形节点// 如果学校名改变了,添加学校节点if (stud.Sname != sname0){tvSC.SelectedNode = tvSC.Nodes.Add(stud.Sname);sname0 = stud.Sname;}// 如果班级名改变了,添加班级节点if (ame != cname0){// 调整当前节点if (tvSC.SelectedNode.Level == 1)tvSC.SelectedNode = tvSC.SelectedNode.Parent;tvSC.SelectedNode = tvSC.SelectedNode.Nodes.Add(ame);cname0 = ame;}// 添加学⽣节点TreeNode node = tvSC.SelectedNode.Nodes.Add(stud.No);node.Tag = stud;}br.Close();fs.Close();}private void miFileWriteBin2_Click(object sender, EventArgs e){// 显⽰保存⽂件对话框SaveFileDialog dlgSave = new SaveFileDialog();if (dlgSave.ShowDialog() != DialogResult.OK)return;// 建⽴⼀个写⽂件流fsFileStream fs = new FileStream(dlgSave.FileName, FileMode.Create, FileAccess.Write); BinaryWriter bw = new BinaryWriter(fs);// 遍历树结构,写⽂本⽂件WriteBinFile2(bw, tvSC.Nodes);// 关闭写流类和⽂件流bw.Close();fs.Close();}private void WriteBinFile2(BinaryWriter bw, TreeNodeCollection nodes){foreach (TreeNode node in nodes){if (node.Level == 2){Student stud = node.Tag as Student;byte[] buffer = ObjectToBytes(stud);bw.Write(buffer.Length);bw.Write(buffer);}if (node.Nodes.Count > 0)WriteBinFile2(bw, node.Nodes);}}// 对象序列化为字节数组public static byte[] ObjectToBytes(Object obj){MemoryStream ms = new MemoryStream();byte[] bytes = null;try{// 序列化BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj);bytes = ms.ToArray();}catch (Exception e){throw new Exception(e.ToString());}finally{ms.Close();}return bytes;}// 字节数组反序列化为对象public static Object BytesToObject(byte[] bytes){MemoryStream ms = new MemoryStream(bytes);Object obj = new Object();try{// 反序列化ms.Position = 0;BinaryFormatter formatter = new BinaryFormatter(); obj = formatter.Deserialize(ms);}catch (Exception e){throw new Exception(e.ToString());}finally{ms.Close();}return obj;}private void miClear_Click(object sender, EventArgs e) {tvSC.Nodes.Clear();}}}下⾯是类的定义。

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);}}递归算法通常不是解决问题最有效的计算机程序,因为递归包含函数调用,函数调用需要时空开销。

TreeView操作及代码实例

TreeView操作及代码实例

TreeView操作及实例代码TreeView组件是由多个类来定义的,TreeView组件是由命名空间"System.Windows.Forms"中的"TreeView"类来定义的,而其中的节点(即Node),是由命名空间"System.Windows.Forms"中的"TreeNode"来定义的。

所以当在程序中创建一个TreeView对象,其实只是创建了一个可以放置节点的"容器"。

而在这个容器中加入一个节点,其实就是加入了从"TreeNode"类中创建的一个节点对象;同样删除一个节点,也就是删除一个"TreeNode"节点对象。

一. TreeView组件中的一些常用方法以及具体实现:T REE V IEW组件虽然是一个操作起来比较麻烦的组件,但归根到底,可以总结为三种基本操作:加入子节点、加入兄弟节点和删除节点。

掌握了这三种常用操作,对于在编程中灵活运用T REE V IEW组件是十分必要的。

下面就分别来加以介绍。

(1).加入子节点:所谓子节点,就是处于选定节点的下一级节点。

加入子节点的具体过程是:首先要在T REE V IEW组件中定位要加入的子节点的位置,然后创建一个节点对象,然后利用TreeVeiw类中对节点的加入方法(即:Add ( )方法),加入此节点对象。

下面就是在treeView1组件中加入一个子节点的具体代码://首先判断是否选定组件中的位置if ( treeView1.SelectedNode == null ){MessageBox.Show ( "请选择一个节点" , "提示信息" , MessageBoxButtons.OK , rmation ) ;}else{//创建一个节点对象,并初始化TreeNode tmp ;tmp = new TreeNode ( "节点名称" ) ;//在TreeView组件中加入子节点treeView1.SelectedNode.Nodes.Add ( tmp ) ;treeView1.SelectedNode = tmp ;treeView1.ExpandAll ( ) ;}(2).加入兄弟节点:所谓兄弟节点,就是在选定的节点的平级的节点。

C#在winform上实现关于treeview与listview结合项目应用

C#在winform上实现关于treeview与listview结合项目应用

C#在winform上实现关于treeview与listview结合项⽬应⽤C#初学:项⽬实现利⽤treeview实现左边菜单伸缩栏,右侧利⽤listview实现右侧数据显⽰,不同单项对应不同列表,当修改列表时,修改记录会显⽰在textbox ⽂本框中。

1.实现treeview树形⽬录: ⾸先,在form整体控件上添加Load事件(每当⽤户加载窗体时发⽣),⾥⾯编写两个函数:this.InitTreeView(this.treeView1);(初始化树形图设置)、this.AddNode(this.treeView1);(添加节点)。

具体代码如下:private void InitTreeView(TreeView treeView) { treeView.CheckBoxes = false;//隐藏复选框 treeView.FullRowSelect = true;//如果单击某项会选择该项及其所有⼦项,则为 true;如果单击某项仅选择项本⾝,则为 false。

默认为 false。

belEdit = false;//不能修改编辑项 treeView.PathSeparator = "\\";//⽤\符号为分隔符 treeView.ShowLines = true;//显⽰连线 treeView.ShowPlusMinus = true;//显⽰+-号 treeView.ShowRootLines = true;//是否在节点之间绘制连线 treeView.AfterSelect += new TreeViewEventHandler(treeView_AfterSelect);//委托 } public void AddNode(TreeView treeView) { //添加节点 TreeNode node = treeView.Nodes[0]; treeView.BeginUpdate(); node.Nodes.Clear(); //增加分类节点 TreeNode node1 = new TreeNode("学⽣"); TreeNode node2 = new TreeNode("⽼师"); TreeNode node3 = new TreeNode("外勤"); TreeNode node4 = new TreeNode("管理员"); node.Nodes.Add(node1); node.Nodes.Add(node2); node.Nodes.Add(node3); node.Nodes.Add(node4); treeView.EndUpdate(); }2.完成treeview和listview的过渡。

1C# 给TREEVIEW控件绑定数据(ASP可作参考)

1C# 给TREEVIEW控件绑定数据(ASP可作参考)

INSERTINTO B VALUES(7,3,'黄晓云')
INSERTINTO B VALUES(8,4,'刘志华')
INSERTINTO B VALUES(9,6,'陈坤华')
INSERTINTO B VALUES(10,6,'杨欢')
INSERTINTO B VALUES(11,2,'曾禾')
{ while (this.treeView1.Nodes.Count> 0) { this.treeView1.Nodes.RemoveAt(0); } List<ContanctInfo> lci = 数据源; int i = 0; int j = 0;//treeview 控件中根节点的索引 int count = lci.Count; //为 treeview 控件添加第一个根节点
{
this.treeView1.Nodes[j].Nodes.Add(lci[i - 1].bName);
}
//如果在 treeview 控件中索引为 j 的根节点的名称与即将要添加的根节点
的名称相同
//就跳过本次循环进行下一次循环,不为 TreeView 添加相同名称的根节点
if(this.treeView1.Nodes[j].Text == lci[i].aName)
Public string bName{get;set;
Public C(){}
}
开发随心,尽善尽美
--月之江南
INSERTINTO B VALUES(2,1,'张小明')
INSERTINTO B VALUES(3,1,'李晓红')

关于ASP.NET中TreeView用法的一个小例子

关于ASP.NET中TreeView用法的一个小例子

关于中TreeView⽤法的⼀个⼩例⼦复制代码代码如下:using System;using System.Collections;using System.Configuration;using System.Data;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.Data.SqlClient;using Common;using DataAccess;public partial class Controls_ProductType2 : erControl{ProductType productType = new ProductType();Product product = new Product();protected void TreeView_TreeNodePopulate(object sender, TreeNodeEventArgs e){if (e.Node.ChildNodes.Count == 0){switch (e.Node.Depth){case 0:PopulateCategories(e.Node);break;case 1:PopulateProductType(e.Node);break;case 2:PopulateProducts(e.Node);break;}}// int i = TreeToXml.TreeToXML(TreeView1, "D:/TreeToXML.xml");}protected void Page_Load(object sender, EventArgs e){}//第⼀级节点(parentID=0)void PopulateCategories(TreeNode node){DataTable dt = new DataTable();dt = productType.GetListByFatherNode();if (dt.Rows.Count > 0){foreach (DataRow row in dt.Rows){TreeNode NewNode = new TreeNode(row["ProductTypeName"].ToString(),row["ProductTypeID"].ToString(),"","../WebProductList.aspx?productTypeIdOne="+ row["ProductTypeID"].ToString() +"",""); NewNode.PopulateOnDemand = true;NewNode.SelectAction = TreeNodeSelectAction.Expand;node.ChildNodes.Add(NewNode);node.Expanded = true ;}}}//第⼆级节点void PopulateProductType(TreeNode node){DataTable dt = new DataTable();QueryParam queryparam = new QueryParam();queryparam.Add("ParentID", QueryParam.RELATION.EQ, "" + node.Value + "");dt = productType.GetListByBranchNode(queryparam);if (dt.Rows.Count > 0){foreach (DataRow row in dt.Rows){TreeNode NewNode = new TreeNode(row["ProductTypeName"].ToString(), row["ProductTypeID"].ToString(), "", "../WebProductList.aspx?productTypeIdTwo=" + row["ProductTypeID"].ToString() + "", "");NewNode.PopulateOnDemand = true;NewNode.SelectAction = TreeNodeSelectAction.Expand;node.ChildNodes.Add(NewNode);node.Expanded = false ;}}}//第三个节点void PopulateProducts(TreeNode node){DataTable dt = new DataTable();QueryParam queryparam = new QueryParam();queryparam.Add("ProductTypeItemID", QueryParam.RELATION.EQ, "" + node.Value + "");dt = product.GetList(queryparam);if (dt.Rows.Count > 0){foreach (DataRow row in dt.Rows){TreeNode NewNode = new TreeNode(row["ProductName"].ToString(), row["ProductID"].ToString(), "","../WebProductDetaile.aspx?productID=" + row["ProductID"].ToString() + "", "");//NewNode.PopulateOnDemand = false;//NewNode.SelectAction = TreeNodeSelectAction.None;NewNode.PopulateOnDemand =true ;NewNode.SelectAction = TreeNodeSelectAction.Expand ;node.ChildNodes.Add(NewNode);node.Expanded = false;}}}}。

pythontkinterTreeview事件绑定

pythontkinterTreeview事件绑定

pythontkinterTreeview事件绑定def trefun(event):sels= event.widget.selection()#event.widget获取Treeview对象,调⽤selection获取选择对象名称for idx in sels:print tv.item(idx)["text"]print"111"if__name__ == '__main__':global tv_dex = dex("classes.dex")_strs = _dex.getStrings()tp = Tk()tv = ttk.Treeview(tp)tv.grid(row = 0, column = 0)scb= ttk.Scrollbar(tp, command = tv.yview)tv.config(yscroll = scb.set)scb.grid(row = 0, column = 1, sticky = "ns")txt= Text(tp)txt.grid(row = 0, column = 2)tv.bind("<<TreeviewSelect>>", trefun)rtnode=tv.insert("",0,"dex",text="dex",values=("1"))apknode=tv.insert(rtnode,1,"apk信息",text="apk信息",values=("1"))strsnode=tv.insert(apknode, 2,"strings",text="strings",values=("1"))dexclsnode=tv.insert(rtnode,1,"dexclasses",text="dexclasses",values=("1"))strslen = len(_strs)for i in xrange(0,strslen):tv.insert(strsnode, -1,strslen - i,text=_strs[i],values=("2"))tp.mainloop()事件:The Treeview widget generates the following virtual events.event description<<TreeviewSelect>>Generated whenever the selection changes.<<TreeviewOpen>>Generated just before settings the focus item toopen=True.<<TreeviewClose>>Generated just after setting the focus item to open=False.tv.bind("<<TreeviewSelect>>", trefun)。

TreeView数据绑定的方法

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);}}。

VFP中TreeView使用实例

VFP中TreeView使用实例

VFP中TreeView使用实例ActiveX控件早已为大多数程序开发人员作为一重要工具来使用。

由于它与开发语言无关,任何支持ActiveX控件的软件平台上,都可以使用ActiveX控件。

就像使用WINDOWS控件一样自如。

然而,ActiveX控件在具体到某种开发工具中去使用时会遇到很多问题,这一点在许多刊物的文章都经常被提出讨论,但大多数都是针对Vc,Delphi,VB,PB等开发平台下的ActiveX控件。

其实,在上述平台中使用ActiveX控件基本上能在其帮助功能中,开发人员依照其示例最终能找到ActiveX控件的属性,方法,事件的使用说明。

甚至有些开发工具已将部分ActiveX控件作为其常用表单控件,使开发人员使用起来感到非常方便。

可是在VFP开发平台下,去使用ActiveX控件就不如上述开发工具那样的幸运,因为VFP 对其根本就未涉及到相关语法说明和示例,使VFP开发者感到尴尬与茫然。

又因,很少有介绍这方面文章。

因此,笔者就以正在开发“楼盘销售软件”为例介绍一下TreeView控件在VFP中的具体使用,以供与笔者同感的VFP同仁参考。

一、首先介绍TreeView 控件TreeView 控件显示Node 对象的分层列表,每个Node 对象均由一个标签和一个可选的位图组成。

TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。

Node 对象是TreeView 控件中的一项,它包含图像和文本。

Nodes 集合包含一个或多个Node 对象。

语法:treeview.Nodes,treeview.Nodes.Item(index)。

可以使用标准的集合方法(例如Add 和Remove 方法)操作Node 对象。

可以按其索引或存储在Key 属性中的唯一键来访问集合中的每个元素。

为选择指定的Node 对象,必须通过它的Index 属性或Key 属性的值去引用它。

treeview控件绑定XML文件

treeview控件绑定XML文件

Value, "", "", nls.Item(i).Attributes[1].Value, "");
nodes.ChildNodes.Add(node);
//Response.Write("&nbsp;&nbsp;&nbsp;&nbsp;&
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + nls1.Item(j).Attributes[0].Value + "
上面蓝色字体是关键,主要用到了树属性中的 XPath 对显示条件进行筛选.从 XML 文档的第二级 节点开始显示. 绑定 TreeView 过程中还可以用循环方式添加节点到树中.方法如下: private void ShowElement()
{ string xmlpath = Server.MapPath(".") + "/TreeMenu/TreeMenu.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlpath); XmlNodeList nodeList = xmlDoc.SelectSingleNode("TreeNodes").ChildNode
bsp;" + nls.Item(i).Attributes[0].Value + "</br>");
//如果下面有子节点再下走
所有子节点
XmlNodeList nls1 = xe2.ChildNodes;//继续获取 xe2 子节点的

ASP NET+TreeView树型菜单操作实例(代码调试通过)

ASP NET+TreeView树型菜单操作实例(代码调试通过)
id="TextBox1" runat="server"></asp:TextBox></TD> </TR> <TR> <TD> <asp:Button
id="addButton" runat="server" Text="添 加"></asp:Button> <asp:Button
id="editButton" runat="server" Text="修 改"></asp:Button> <asp:Button
(TreeView1.SelectedNodeIndex); int id=Int32.Parse(treenode.Target); string classname=TextBox1.Text; if(treenode.Target!=null) { OleDbConnection conn=new OleDbConnection();
runat="server"></iewc:TreeView></TD> <TD vAlign="top"> <TABLE id="Table2" cellSpacing="1"
cellPadding="1" width="100%" border="0"> <TR> <TD>节点名 <asp:TextBox
ListItem list=new ListItem(); if (ds.Tables[0].Rows[i]["depth"].ToString()=="0") { list.Text=ds.Tables[0].Rows[i]

自-TreeView手动绑定数据

自-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;}}}。

treeview控件用法

treeview控件用法

treeview控件用法TreeView控件是一种类似于目录树的控件,用于显示层次结构的数据。

它通常用来显示文件和文件夹的层次关系,也可以用来显示任何具有层次结构的数据。

使用TreeView控件的一般步骤如下:1. 在窗体中放置一个TreeView控件。

2. 使用Nodes属性添加根节点和子节点。

3. 为每个节点设置Text属性,用来显示节点的文本。

4. 可以设置节点的ImageIndex属性和SelectedImageIndex属性,来显示节点的图标。

5. 使用父节点的Nodes属性来添加子节点,形成层次结构。

6. 可以为节点添加事件处理程序,以便响应节点的单击、双击等操作。

以下是一个简单的例子,演示如何使用TreeView控件:```c#// 创建根节点TreeNode rootNode = new TreeNode("根节点");// 创建子节点TreeNode childNode1 = new TreeNode("子节点1");TreeNode childNode2 = new TreeNode("子节点2");TreeNode childNode3 = new TreeNode("子节点3");// 将子节点添加到根节点rootNode.Nodes.Add(childNode1);rootNode.Nodes.Add(childNode2);rootNode.Nodes.Add(childNode3);// 将根节点添加到TreeView控件treeView1.Nodes.Add(rootNode);```这样就创建了一个简单的TreeView控件,其中包含一个根节点和三个子节点。

在VisualFoxPro中使用TreeView控件TreeView控件VFP时...

在VisualFoxPro中使用TreeView控件TreeView控件VFP时...

在VisualFoxPro中使用TreeView控件TreeView控件VFP时...在Visual FoxPro中使用TreeView控件如果用户在设计程序时,需要用一种树形结构生动形象地显示具有不同层次的数据,那么TreeView控件将是最合适的选择。

TreeView控件可以将用户选定的数据,也可以是从数据库中检索出来的数据,供用户自由的选择、展开或折迭收起。

TreeView控件主要用以显示层次数据之间的关系。

TreeView控件的特点包括以下几个方面:1、将相互间有联系的数据用图形与文字方式以树形描绘,以树形节点(Node对象)的形式展开或收起数据;2、每一个节点可以用图标和文本标签来描述;3、标签可以设置为是否允许修改的属性;4、对层次深度和节点数目无限制,只受系统资源的限制。

另外,使用TreeView控件对管理信息量很大的数据来说,是一个很好的方式,因为用户能从中简单快速的选择到所需要的数据。

Windows资源管理器就是TreeView控件、ImageList控件与ListView控件配合应用的一个例子。

TreeView控件是Microsoft Visual Studio 中的一个控件,它是Mscomctl.ocx文件中的一组ActiveX控件的一部分。

当安装了Visual FoxPro或Visual Basic后就可以在Windows的System目录中找到这个文件。

为了在发布的应用程序中使用TreeView控件,必须将Mscomctl.ocx文件与应用程序一起做成安装盘发布。

这个控件在Visual FoxPro 5.0中的版本是5.0,但是该控件的5.0版本不支持6.0版本的一些属性、方法和事件,所以要尽量使用6.0版本。

如果没有Visual FoxPro 6.0也可以,只要找到Mscomctl.ocx这个文件并将其注册,就可以在Visual FoxPro 5.0中使用该控件的6.0版本。

树控件TreeView

树控件TreeView

树控件TreeView---实例1 添加TreeView控件在“控件工具箱”中单击鼠标右键,从弹出的快捷菜单中选择“附加控件”(如图1所示),出现“附加控件”对话框。

在该对话框中,找到“Microsoft TreeView Control,version 6.0”并选中前面的复选框,如图2所示,单击“确定”按钮。

图1:在工具箱中单击右键,选择“附加控件”。

图2:在“附加控件”对话框选中“TreeView控件”。

注:下面的示例中可能要用到ImageList控件和ImageCombo控件,因此,将这两个控件也添加到“控件工具箱”中。

最后的控件工具箱如图3所示。

图3:添加控件后的工具箱。

2 TreeView控件概述TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成。

TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。

创建了TreeView控件之后,可以通过设置属性与调用方法对各Node对象进行操作,这些操作包括添加、删除、对齐和其它操作。

可以编程展开与折叠Node对象来显示或隐藏所有子节点。

Collapse、Expand和NodeClick三个事件也提供了编程功能。

2.1 常用属性(1) Nodes属性返回对TreeView控件的Node对象的集合的引用。

[语法] object.Nodesobject代表一个对象表达式。

可以使用标准的集合方法(例如:Add和Remove方法)操作Node对象,可以按其索引或存储在Key属性中的唯一键来访问集合中的每个元素。

(2) Style属性返回或设置图形类型(图象、文本、+/-号、直线)以及出现在TreeView控件中每一Node对象上的文本的类型。

[语法] object.Style [ = number]Object代表一个对象表达式,number指定图形类型的整数,number 的设置值是:0仅为文本;1为图象和文本,2为+/-号和文本;3为+/- 号、图象和文本;4为直线和文本;5为直线、图象和文本;6为直线、+/-号和文本;7(缺省)为直线、+/- 号、图象和文本。

C#TreeView从数据库绑定数据的示例

C#TreeView从数据库绑定数据的示例

C#TreeView从数据库绑定数据的⽰例封装成⼀个函数,⽅便直接调⽤//绑定TrreViewprivate void InitModuleTree(DataTable dt){//清空treeview上所有节点this.tree_Role.Nodes.Clear();int[] gen = new int[dt.Rows.Count]; //⽤于存储⽗节点Tagint[] zi = new int[dt.Rows.Count]; //⽤于存储⼦节点Tagfor (int i = 0; i < gen.Length; i++){string zhi=dt.Rows[i][3].ToString();//获取节点Tag值 eg:1-2if (zhi.Length>1) //表⽰是⼦节点 eg:1-2{gen[i] = int.Parse(zhi.Substring(0, zhi.IndexOf('-')));zi[i] = int.Parse(zhi.Substring(zhi.IndexOf('-') + 1));}else //表⽰是根节点 eg:2{//将所有⽗节点加到treeview上zi[i] =int.Parse(zhi);TreeNode nodeParent = new TreeNode();nodeParent.Tag = (zi[i]).ToString();nodeParent.Text = dt.Rows[i][1].ToString();tree_Role.Nodes.Add(nodeParent);}}bindChildNote(dt,gen,zi);}//绑定⼦节点private void bindChildNote(DataTable dt, int[] gen, int[] zi){for (int i = 0; i < gen.Length; i++){if (gen[i] != 0 && zi[i] != 0) //便利所有节点,找到所有⼦节点{TreeNode childNode = new TreeNode();foreach (TreeNode item in tree_Role.Nodes) //便历treeview上所有⽗节点{if (item.Tag.ToString() == gen[i].ToString()) //找到当前⼦节点的⽗节点{childNode.Tag = zi[i].ToString();childNode.Text = dt.Rows[i][1].ToString();item.Nodes.Add(childNode);}}}}tree_Role.ExpandAll(); //展开整棵树}数据库结构:最终结果:引⽤代码:namespace TreeeeeeeeeeeView{public partial class Treeeeeeeeeee : Form{public Treeeeeeeeeee(){InitializeComponent();//从数据库获取数据,得到结果为DataTableSystemManager.Dao.RolePower dao = new SystemManager.Dao.RolePower();DataSet ds = pressUtil.DeCompress(dao.getSystemModule());DataTable dt = ds.Tables[0];InitModuleTree(dt);}//绑定TrreViewprivate void InitModuleTree(DataTable dt){//清空treeview上所有节点this.tree_Role.Nodes.Clear();int[] gen = new int[dt.Rows.Count]; //⽤于存储⽗节点Tagint[] zi = new int[dt.Rows.Count]; //⽤于存储⼦节点Tagfor (int i = 0; i < gen.Length; i++){string zhi=dt.Rows[i][3].ToString();//获取节点Tag值 eg:1-2if (zhi.Length>1) //表⽰是⼦节点 eg:1-2{gen[i] = int.Parse(zhi.Substring(0, zhi.IndexOf('-')));zi[i] = int.Parse(zhi.Substring(zhi.IndexOf('-') + 1));}else //表⽰是根节点 eg:2{//将所有⽗节点加到treeview上zi[i] =int.Parse(zhi);TreeNode nodeParent = new TreeNode();nodeParent.Tag = (zi[i]).ToString();nodeParent.Text = dt.Rows[i][1].ToString();tree_Role.Nodes.Add(nodeParent);}}bindChildNote(dt,gen,zi);}//绑定⼦节点private void bindChildNote(DataTable dt, int[] gen, int[] zi){for (int i = 0; i < gen.Length; i++){if (gen[i] != 0 && zi[i] != 0) //便利所有节点,找到所有⼦节点{TreeNode childNode = new TreeNode();foreach (TreeNode item in tree_Role.Nodes) //便历treeview上所有⽗节点{if (item.Tag.ToString() == gen[i].ToString()) //找到当前⼦节点的⽗节点{childNode.Tag = zi[i].ToString();childNode.Text = dt.Rows[i][1].ToString();item.Nodes.Add(childNode);}}}}tree_Role.ExpandAll(); //展开整棵树}}}以上就是C# TreeView从数据库绑定数据的⽰例的详细内容,更多关于C# TreeView从数据库绑定数据的资料请关注其它相关⽂章!。

C#实现treeview绑定的方法

C#实现treeview绑定的方法

C#实现treeview绑定的⽅法本⽂实例讲述了C#实现treeview绑定的⽅法。

分享给⼤家供⼤家参考。

具体实现⽅法如下:复制代码代码如下:protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){bindTree();}}private void bindTree(){ALIYUN_PIC.BLL.Folder_oper_BLL bll = new Folder_oper_BLL();DataTable dt = bll.PIC_Bind();//得到需要的datatablethis.FillNode(dt, null);}private void FillNode(DataTable dt, TreeNode node){DataView dv = new DataView(dt);if (node == null) //根结点{dv.RowFilter = "PARENT_NODE='0'"; //筛选到根结点的所有⼦节点}else //不是根结点{dv.RowFilter = "PARENT_NODE='" + node.Value + "'"; //筛选对应节点的所有⼦节点}foreach (DataRowView drv in dv) //遍历填充节点的所有⼦节点,如果传⼊的节点node为叶⼦节点,遍历要退出,不再进⾏递归{TreeNode no = new TreeNode(drv["NODE_NAME"].ToString(), drv["id"].ToString());FillNode(dt, no); //填充no节点的⼦节点if (node == null){this.PIC_TREE.Nodes.Add(no);}else{node.ChildNodes.Add(no);}}}希望本⽂所述对⼤家的C#程序设计有所帮助。

wpf之TreeView绑定

wpf之TreeView绑定

wpf之TreeView绑定wpf之TreeView绑定wpf绑定TreeView,貌似比winForm可能要麻烦一些,不过仔细分析一下,还是很好解决的,最近做了一个项目,正好写了一下,下面把代码贴出来和大家分享一下先看一个简单的绑定//代码绑定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,类型就是节点类本身///<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中WebDictClassServices.WebDictClass webDict = new WebDic tClass();//根节点添加到treeVIew中private void loadTree(){tvProperties.Items.Clear();//加载根节点前先清除Treeview控件项List<PropertyNodeItem> itemList = new List<PropertyNod eItem>();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"].T oString(),id=Convert.ToInt32(dv[0].Row["id"].T oString()),parentId=Convert.ToInt32(dv[0].Row["ParentId"].ToString()), IsExpanded=true};int id =Convert.T oInt32(dv[0]["id"].ToString());int pid = Convert.T oInt32(dv[0]["ParentId"].T oString());ForeachPropertyNode(node, id);itemList.Add(node);Properties.ItemsSource = itemList;}然后,在 ForeachPropertyNode方法中,实现了无限极节点//无限接循环子节点添加到根节点下面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"].T oString());string name = view["title"].ToString();int parentId = Convert.ToInt32(view["ParentId"].ToString());PropertyNodeItem childNodeItem = new PropertyNodeIte m(){DisplayName = name,Name = name,id=id,parentId=parentId,IsExpanded=false};ForeachPropertyNode(childNodeItem, id);node.Children.Add(childNodeItem);}}}如果我们想触发点击节点事件//选中节点事件private void tvProperties_SelectedItemChanged(object send er, RoutedPropertyChangedEventArgs<object> e){PropertyNodeItem item = Properties.SelectedItem as PropertyNodeItem;string nodeText= ;// MessageBox.Show(nodeT ext);}前台的xaml文件<TreeView Height="264" x:Name="tvProperties" Width="2 20" SelectedItemChanged="tvProperties_SelectedItemChanged "><TreeView.ItemContainerStyle><Style TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="{Binding IsExpande d}"></Setter></Style></TreeView.ItemContainerStyle><TreeView.ItemTemplate><HierarchicalDataT emplate ItemsSource="{Binding Path=C hildren}"><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}"></T extBlock><Image VerticalAlignment="Center" Source="{Binding EditI con}" Margin="2,0,0,0"></Image><StackPanel.ToolTip><TextBlock VerticalAlignment="Center" Text="{Binding Na me}" TextWrapping="Wrap" MaxWidth="200"></TextBlock></StackPanel.T oolTip></StackPanel></HierarchicalDataTemplate></TreeView.ItemT emplate></TreeView>可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从而取得相关的值多思考,多创新,才是正道!分类: C# WinForm/WPF。

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

Private mDbBiblio As Database
如果希望该数据库还可被其它模块使用.可以用 Public 语句.并重命名该变量.以表明它是全局的.例如 gDbBiblio.
在创建 Node 对象时.在 Set 语句中(如下所示)使用 Node 类型的变量.
Dim TempNode As Node
'并将记录集赋予它们.
Dim rsPublishers As Recordset
Dim rsTitles As Recordset
Set rsPublishers = mDbBiblio. _
OpenRecordset("Publishers". dbOpenDynaset)
Set rsTitles = mDbBiblio. _
将 Biblio.mdb 数据库绑定到 TreeView 控件
在工程中添加对 数据访问对象(DAO 3.0)的引用.
为 Database 和 Node 对象创建模块级的变量.
在 Form Load 事件中.用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库.
'在 Form_Load 事件中.设置对象变量.
'并创建 TreeView 控件的第一个 Node 对象.
Set mDbBiblio = DBEngine.Workspaces(0). _
OpenDatabase("BIBLIO.MDB")
tvwDB.Sorted = True
Set mNode = tvwDB.Nodes.Add()
用 Nodes 集合的 Add 方法创建顶层的节点对象.
在 CommandButton 的 Click 事件中.创建两个 Recordset 变量.并将它们设置为 Publishers 和 Titles 表.
用[Do Until"语句为表中的每个出版商创建一个 Node 对象.
对每个出版商.在 Titles 记录集中检查匹配的 PubID 字段,为每个匹配项添加一个子节点.
mNode.Text =
注意.在上面的代码中.在创建 Node 的同时用 Set 语句将其赋给了 mNode 对象变量.由于 mNode 变量现在包含了新创建的 Node 对象.可以对该 Node 对象的属性进行赋值.在上述情况下.Database 的名称(即 Database 对象的 Name 属性)已经被赋给了新节点的 Text 属性.
mNode.Text = "Publishers"
mNode.Tag = '设置 Tag 属性.
mNode.Image = "closed" '设置 Image
'属性
End Sub
Private Sub cmdLoad_Click()
'声明 DAO 对象变量.
'Node 对象的文本.
Do Until rsPublishers.EOF
Set mNode = tvwDB.Nodes.Add(1. tvwChild)
mNode.Text = rsPublishers!Name
mNode.Tag = "Publisher" 'Tag 标识该表.
'为 Key 赋予唯一的 ID
'中出现相同 PubID 的记录.如果找到这样的记录.
'则在 TreeView 控件中加入 Node 对象.并将用所
'找到记录的 Title. ISBN 和 Author 字段为新
'Node 对象的属性赋值.
Do Until rsTitles.EOF
If rsPublishers!PubID = rsTitles!PubID Then
TreeView 控件应用实例:将 TreeView 绑定到 Biblio.mdb 数据库
应用示例:DataTree.vbp
本章的代码示例是从应用示例 DataTree.vbp which is listed in the Samples directory中得到的.
可将数据库中的数据绑定到 TreeView 控件.下面的示例将 TreeView 控件绑定到 Biblio 数据库.该数据库可以在 Visual Basic CD 中找到.该应用实例将 Publishers 表作为树节点的第一层.如果一个出版商对应于一个或多个书名.则这些书名将作为该出版商的子节点加入树中.
对每个出版商.在 Titles 记录集中检查匹配的 PubID 字段,为每个匹配项添加一个子节点
上面的代码将 Publishers 表的内容作为第一层填入 TreeView 中.然而.我们还希望能够进入更深一层.为每个出版商节点增加子节点.每个子节点代表该出版商印刷的一本书.
为了做到这一点.如果有了对新创建的出版商节点 (mNode) 的引用.只要遍历 Titles 记录集.并检查每条记录的 PubID 字段即可.如果该字段与 Publishers 记录集中的 PubID 字段相匹配.则该书是由当前的出版商出版的.但是.在能够为 mNode 添加节点之前.还必须先将 mNode 的 Index 属性赋给一个变量 (intIndex).如下所示:
mNode.Key = CInt(rsPublishers!PubID) & " ID"
'将变量 intIndex 设置为新创建 Node 的 Index 属性.
'用该变量将子 Node 对象加入当前 Node.
intIndex = mNode.Index
'对这条记录.在 Title 表中查找与 Titles 记录集
至此.Database 对象变量已经被初始化为 Biblio 数据库.现在可以创建树中的第一个节点.并将打开的数据库的名称赋予它.首先必须用 Node 集合的 Add 方法创建第一个 Node 对象.还要使用 Set 语句将其赋给 mNode 对象变量.如下所示:
Set mNode = tvwDB.Nodes.Add() ' 创建第一个节点.
intIndex = mNode.Index
然后就可以在 Add 方法中使用该变量了.Add 方法需要用来加入子节点的 Node 对象的 Index 属性:
Set mNode = tvwDB.Nodes.Add(intIndex. tvwChild)
如下简化的代码可被表述为[直到 Recordset 的结尾:创建子 Node 对象.并将 Title 字段的值赋给它的 Text 属性,移动到下一记录并重复上述操作":
OpenRecordset("titles". dbOpenDynaset)
'移到第一条记录.
rsPublishers.MoveFirst
Dim intIndex As Integer '用于索引的变量.
'直到最后一条记录 (EOF):添加一个 Node 对象.
'并用 Name 字段作为新
OpenRecordset("titles". dbOpenDynaset)
用 Do Until 语句为表中的每个出版商创建一个 Node 对象
现在有两个打开的记录集.可以遍历每个记录集.创建 Node 对象.并为该对象的 Text 属性赋予合适的值.首先.必须遍历 Publishers 表.并为该表中的每个出版商创建一个 Node 对象.
图 2.42 与数据绑定的 TreeVew 控件
下面的代码用到了如下对象:
Data Access Object Library(3.5)
名为[frmDataTree"的 Form 对象
名为[tvwDB"的 TreeView 控件
名为[cmdLoad"的 CommandButton 控件
CommandButton Click 事件:创建两个 Recordset 变量.并将它们分别设置为 Publishers 和 Titles 表
本应用实例假定存在名为[cmdLoad"的按钮.并且当用户单击它时.置入 Biblio 数据库中的两个表到 TreeView 控件中.为此.必须首先在该按钮的 Click 事件中声明两个 DAO 对象变量.第一个变量 rsPublishers 用来包含 Publishers 表.第二个变量 rsTitles 用来包含 Titles 表.下面的代码声明了这两个变量.并用 OpenRecordSet 方法将表赋给变量:
下列简化了的代码可以用一句话概括为.[逐个处理每个记录.直到记录集的末尾:创建 Node 变量.并将 Title 字段的值赋给其 Text 属性.移到下一记录并重复":
Do Until rsPublishers.EOF
Set mNode = tvwDB.Nodes.Add(1. tvwChild)
Set TempNode = tvwDB.Nodes.Add()
虽然可以在添加 Node 对象时创建变量.更有效的方式是声明一个模块级的 Node 对象变量.并用它创建所有的 Node 对象.在上述声明部分再键入:
Private mNode As Node
用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库
Form 对象的 Load 事件中可以初始化 Database 变量.代码如下:
Set mDbBiblio = DBEngine.OpenDatabase("BIBLIO.MDB")
在成功地初始化 Database 对象变量后.就可以在该模块的代码中的任何位置自由地访问它了.
Form Load 事件:用 Nodes 集合的 Add 方法创建顶层的 Node 对象
相关文档
最新文档