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