WindowForm组件TreeView

TreeView控件 树形控件
介绍: 分层显示标签的项 集合

1.属性

2.方法
添加节点数据量大会闪烁
BeginUpdate() 禁止重绘
//添加节点
EndUpdate() 启用重绘
CollapseAll() 折叠所有节点,ExpandAll() 展开所有节点
GetNodeAt(节点对象) 获取节点 GetNodeAt(x,y) 节点坐标获取节点

3.事件
AfterCheck —BeforeCheck 勾选
AfterSelect—BeforeSelect 选中
AfterCollapse—BeforeCollapse 展开
AfterExpand—BeforeExpand 折叠
NodeMouseClick 鼠标单击节点

手动添加节点
1.节点介绍 TreeNode
属性: Name --唯一标识节点 Text 显示的文本 Nodes 子节点集合

应用:权限分配
在这里插入图片描述

private void FrmTreeView_Load(object sender, EventArgs e)
{
    treeView1.Nodes.Clear();		//清除所有节点
    //如果一个节点下面有子节点,我是应该先把这个节点添加到treeview中,还是先应该添加好子节点,再添加到treeview?  都可以
    //添加节点过程:创建一个节点,将这个节点添加到treeview的Nodes集合;创建一个节点,将这个节点添加到当前节点的Nodes集合。。。。。。
    //更多的应用不是这样,而采用递归的方式,加载节点及子节点,数据的来源:制作成张表,ParentId---父节点编号

    //创建根节点 
    TreeNode root = new TreeNode();
    root.Name = "root";  			//节点名称
    root.Text = "学生管理系统";		//节点文本
    treeView1.Nodes.Add(root);		//将一个节点添加 到TreeView上
	//子节点(二级节点)
    TreeNode subNode = new TreeNode();
    subNode.Name = "stuManage";
    subNode.Text = "学生管理";
    root.Nodes.Add(subNode);		//添加一个子节点
	//三级节点
    TreeNode thirdNode = new TreeNode();
    thirdNode.Name = "addStudent";
    thirdNode.Text = "新增学生";
    subNode.Nodes.Add(thirdNode);
    thirdNode = new TreeNode();
    thirdNode.Name = "stuList";
    thirdNode.Text = "学生列表";
    subNode.Nodes.Add(thirdNode);
	//二级节点
    subNode = new TreeNode();
    subNode.Name = "classManage";
    subNode.Text = "班级管理";
    root.Nodes.Add(subNode);	//添加一个子节点
	//二级节点
    subNode = new TreeNode();
    subNode.Name = "gradeManage";
    subNode.Text = "年级管理";
    root.Nodes.Add(subNode);	//添加一个子节点
}

动态添加节点(递归)
表数据:存储的是节点与子节点关系数据 看不出层次关系
动态加载数据到TreeView控件的流程
①表数据获取出来
②创建一个方法:创建节点并且添加到TreeView 递归的原理:自己调用自己
(子节点可以有多个)
③调用方法 创建节点 体现在TreeView中 --有层次关系的数据
动态加载节点:节点创建好添加到TreeView中,再创建它的子节点,再添加到它的Nodes集合中
在这里插入图片描述
在这里插入图片描述

private void FrmTreeView_Load(object sender, EventArgs e)
{
    treeView1.Nodes.Clear();//清除所有节点
    //1. 获取数据
    DataTable dtMenus = DBHelper.GetDataTable("select Id,MName,ParentId from MenuInfos", 1);
    //3.调用方法,添加节点
    CreateNode(dtMenus, null, 0);
}

//2.添加节点(递归)
private void CreateNode(DataTable dt,TreeNode pNode,int parentId)
{
    //1.获取要创建的节点数据
   DataRow[] rows = dt.Select("ParentId=" + parentId);
    if(rows.Length>0)
    {
        foreach (DataRow  r in rows)
        {
            //2.节点信息
            TreeNode node = new TreeNode();
            node.Name = r["Id"].ToString();
            node.Text = r["MName"].ToString();
            //3.直接添加到TreeView Nodes  还是添加指定节点的Nodes里? 
            if (pNode != null)
                pNode.Nodes.Add(node);		//子节点
            else
                treeView1.Nodes.Add(node);	//根节点
            //4.判断当前节点下有没有子节点
            CreateNode(dt, node, int.Parse(node.Name));
        }
    }
}

TreeView节点的勾选处理
1.父节点勾选或取消,它的所有子节点与它一致
2.只要有一个子节点勾选,父节点就勾选;子节点全部不勾选,父节点就不勾选
在这里插入图片描述
在这里插入图片描述

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
   if( e.Action ==TreeViewAction.ByMouse||e.Action==TreeViewAction.ByKeyboard)
    {
        SetChildNodesState(e.Node);
        SetParentNodeState(e.Node);
    }
}
//递归处理子节点的勾选
private void SetChildNodesState(TreeNode node)
{
    if (node.Nodes.Count > 0)
    {
        foreach (TreeNode n in node.Nodes)
        {
            n.Checked = node.Checked;
            SetChildNodesState(n);
        }
    }
}
//处理父节点
private void SetParentNodeState(TreeNode node)
{
    TreeNode pNode = node.Parent;		//获取父节点
    if(pNode!=null)
    {
        bool bl = false;
        foreach (TreeNode n in pNode.Nodes)
        {
            if (n.Checked)
            {
                bl = true;
                break;
            }
        }
        pNode.Checked = bl;
        SetParentNodeState(pNode);
    } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值