treeview 控件使用和数据绑定
一、TreeViewe 是由多个类来定义的,TreeView组件是由命名空间“System.Windows.Froms”中的“TreeView”类来定义的,而其中的节点(即Node),是由命名空间“System.Windows.Froms”中的“TreeNode”来定义的。所以在程序中创建一个TreeVirew对象,其实只是创建了一个可以防止检点的“容器”。而在这个容器中加入一个节点,其实就是加入了从“TreeNode”类中创建的一个节点对象;同样删除一个节点,也就是删除一个“TreeNode”对象。
二、 C#操作TreeView组件中的一些常用方法以及具体实现:
可以总结为三种基本操作:加入子节点、加入兄弟节点和删除节点
1.加入子节点
所谓子节点,就是处于选定节点的下一级节点。加入子节点的具体过程是:首先要在TreeView组件中定位要加入的子节点的位置,然后创建一个节点对象,然后利用TreeVeiw类中对节点的加入方法(即:Add ( )方法),加入此节点对象。下面就是在treeView1组件中加入一个子节点的具体代码:
//首先判断是否选定组件中的位置 if (treeView1.SelectedNode == null) { MessageBox.Show("请选择一个节点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { //创建一个节点对象,并初始化 TreeNode tmp; tmp = new TreeNode("节点名称"); //在TreeView组件中加入子节点 treeView1.SelectedNode.Nodes.Add(tmp); treeView1.SelectedNode = tmp; treeView1.ExpandAll(); }
2.加入兄弟节点
所谓兄弟节点,就是在选定的节点的平级的节点。加入兄弟节点的方法和加入子节点的方法基本一致,只是在最后的实现方法上有着略微的区别。加入兄弟节点的具体步骤,首先也是要确定要加入的兄弟节点所处的位置,接着定义一个节点对象,最后调用TreeView类中对兄弟节点加入的方法,加入此节点对象。加入兄弟节点和加入子节点的最大区别就在于这最后一步。希望读者能够注意。下面是在TreeView组件加入一个兄弟节点的具体代码:
//首先判断是否选定组件中节点的位置 if (treeView1.SelectedNode == null) { MessageBox.Show("请选择一个节点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { //创建一个节点对象,并初始化 TreeNode tmp; tmp = new TreeNode(textBox1.Text); //在TreeView组件中加入兄弟节点 treeView1.SelectedNode.Parent.Nodes.Add(tmp); treeView1.ExpandAll(); }
3.删除节点
删除节点就是删除TreeView组件中选定的节点,删除节点可以是子节点,也可以是兄弟节点,但无论节点的性质如何,必须保证要删除的节点没有下一级节点,否则必须先删除此节点中的所有下一级节点,然后再删除此节点。删除节点比起上面的二个操作要显得略微简单,具体方法是:首先判断要删除的节点是否存在下一级节点,如果不存在,就调用TreeView类中的Remove ( )方法,就可以删除节点了。下面是删除TreeView组件中节点的具体代码:
//判断选定的节点是否存在下一级节点 if ( treeView1.SelectedNode.Nodes.Count == 0 ) //删除节点 treeView1.SelectedNode.Remove ( ) ; else MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信 息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
4.TreeView组件的一些其他常用操作:
< I > .展开所有节点:
要展开TreeView组件中的所有节点,首先就要把选定的节点指针定位在TreeView组件的根节点上,然后调用选定组件的ExpandAll方法就可以了,下面是具体代码:
//定位根节点 treeView1.SelectedNode = treeView1.Nodes [ 0 ] ; //展开组件中的所有节点 treeView1.SelectedNode.ExpandAll ( ) ;
< II > .展开选定节点的下一级节点:
由于只是展开下一级节点,所以就没有必要用ExpandAll ( )方法了。展开下一级节点只需要调用Expand ( )方法就可以了,下面是具体的实现代码:
treeView1.SelectedNode.Expand ( ) ;
< III > .折叠所有节点:
折叠所有节点和展开所有节点是一组互操作,具体实现的思路也大致相同,折叠所有节点也是首先要把选定的节点指针定位在根节点上,然后调用选定组件的Collapse ( )就可以了,下面是具体的实现代码:
//定位根节点 treeView1.SelectedNode = treeView1.Nodes [ 0 ] ; //折叠组件中所有节点 treeView1.SelectedNode.Collapse ( ) ;
三、实例
using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows .Forms ; using System.Data ; namespace 全面掌握TreeView组件的使用方法 { /// Form1 的摘要说明。 public class Form1 : Form { private TreeView treeView1 ; private Button button1 ; private Button button2 ; private Button button3 ; private MenuItem menuItem2 ; private MenuItem menuItem3 ; private MenuItem menuItem4 ; private ContextMenu contextMenu1 ; private TextBox textBox1 ; private Label label1 ; /// 必需的设计器变量。 private System.ComponentModel.Container components = null ; public Form1 ( ) { //初始化窗体中的组件 InitializeComponent ( ) ; } /// 清理所有正在使用的资源。 protected override void Dispose ( bool disposing ) { if ( disposing ) { if ( components != null ) { components.Dispose ( ) ; } } base.Dispose ( disposing ) ; } private void InitializeComponent ( ) { //初始化代码(略) } [ STAThread ] static void Main ( ) { Application.Run ( new Form1 ( ) ) ; } private void AddChildNode ( ) { //首先判断是否选定组件中的位置 if ( treeView1.SelectedNode == null ) { MessageBox.Show ( "请选择一个节点" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; } else { if ( textBox1.Text != "" ) { //创建一个节点对象,并初始化 TreeNode tmp ; tmp = new TreeNode ( textBox1.Text ) ; //在TreeView组件中加入子节点 treeView1.SelectedNode.Nodes.Add ( tmp ) ; treeView1.SelectedNode = tmp ; treeView1.ExpandAll ( ) ; } else { MessageBox.Show ( "TextBox组件必须填入节点名称!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; return ; } } } private void AddParent ( ) { //首先判断是否选定组件中节点的位置 if ( treeView1.SelectedNode == null ) { MessageBox.Show ( "请选择一个节点" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; } else { if ( textBox1.Text != "" ) { //创建一个节点对象,并初始化 TreeNode tmp ; tmp = new TreeNode ( textBox1.Text ) ; //在TreeView组件中加入兄弟节点 treeView1.SelectedNode.Parent.Nodes.Add ( tmp ) ; treeView1.ExpandAll ( ) ; } else { MessageBox.Show ( "TextBox组件必须填入节点名称!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; return ; } } TreeNode tnode = new TreeNode ( textBox1.Text ) ; } private void treeView1_MouseDown ( object sender , MouseEventArgs e ) { if ( e.Button == MouseButtons.Right ) contextMenu1.Show ( this , new Point ( e.X , e.Y ) ) ; } private void button1_Click ( object sender , System.EventArgs e ) { treeView1.SelectedNode.Expand ( ) ; } private void menuItem2_Click ( object sender , System.EventArgs e ) { AddChildNode ( ) ; } private void menuItem3_Click ( object sender , System.EventArgs e ) { AddParent ( ) ; } private void menuItem4_Click ( object sender , System.EventArgs e ) { //判断选定的节点是否存在下一级节点 if ( treeView1.SelectedNode.Nodes.Count == 0 ) //删除节点 treeView1.SelectedNode.Remove ( ) ; else MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信 息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; } private void button2_Click ( object sender , System.EventArgs e ) { //定位根节点 treeView1.SelectedNode = treeView1.Nodes [ 0 ] ; //展开组件中的所有节点 treeView1.SelectedNode.ExpandAll ( ) ; } private void button3_Click ( object sender , System.EventArgs e ) { //定位根节点 treeView1.SelectedNode = treeView1.Nodes [ 0 ] ; //折叠组件中所有节点 treeView1.SelectedNode.Collapse ( ) ; } } }
四、数据绑定
默认展开树的级别;0是不展开;1是展开一级;
1.递归法
public partial class _Default : System.Web.UI.Page { private void LoadTree(TreeNode parentNode) { List<ChinaStates> list = new chinabf().selectByCode(parentNode.Value); if (list.Count == 0) { return; } foreach (ChinaStates item in list) { TreeNode childNode = new TreeNode(); childNode.Text = item.AreaName; childNode.Value = item.AreaCode; parentNode.ChildNodes.Add(childNode); LoadTree(childNode); } } protected void Page_Load(object sender, EventArgs e) { TreeNode root = new TreeNode(); root.Text = "中国"; root.Value = "0001"; TreeView1.Nodes.Add(root); LoadTree(root); } }
2.for嵌套
public void treeBind() { TreeNode root = new TreeNode(); root.Text = "汉企数据通软件有限公司"; root.Value = "H001"; root.SelectAction = TreeNodeSelectAction.None; TreeView1.Nodes.Add(root); List<Department> list = new Function().SelectPart(); List<Worker> data=new List<Worker>(); foreach (Department item in list) { TreeNode firstNode = new TreeNode(); firstNode.Text = item.Department1; firstNode.Value = item.DepartCode; firstNode.SelectAction = TreeNodeSelectAction.None; root.ChildNodes.Add(firstNode); List<Worker>arr= new Function().SelectWorker(item.Department1); foreach (Worker workers in arr) { TreeNode child = new TreeNode(); child.Text = workers.Wname; child.Value = workers.Wid.ToString(); child.SelectAction = TreeNodeSelectAction.None; firstNode.ChildNodes.Add(child); } } }
3.遍历所有子节点,找出选中项
protected void Button1_Click(object sender, EventArgs e) { List<TreeNode> listNodes = new List<TreeNode>(); foreach (TreeNode node in TreeView1.Nodes) { if (node != null) { FindCheckNode(node, listNodes); } else { return; } } } private void FindCheckNode(TreeNode node, List<TreeNode> listNodes) { if (node.Checked) { listNodes.Add(node); } foreach (TreeNode childnode in node.ChildNodes) { FindCheckNode(childnode, listNodes); } }