文章目录
- `TreeView` 基本的知识
- 属性
- 方法
- 事件
- `TreeView` 案例演示
- 案例一:
- 案例二:
TreeView
控件 用于展示分层数据,它以树形结构展示信息,每个节点可以有一个或多个子节点。TreeView
控件允许用户以可展开和可折叠的形式查看复杂的层次信息。
TreeView
基本的知识
属性
- Nodes: 一个 TreeNodeCollection,包含控件的根节点。
- SelectedNode: 获取或设置当前选中的 TreeNode。
- CheckBoxes: 确定是否在每个树节点旁边显示复选框。
- ShowPlusMinus: 确定是否显示用于展开和折叠树节点的加号和减号。
- ShowLines: 确定是否显示树节点之间的连接线。
方法
- BeginUpdate(): 暂停绘制控件,可以用于在添加大量节点时避免重绘,提高性能。
- EndUpdate(): 恢复正常绘制控件,与
BeginUpdate()
配对使用。 - CollapseAll(): 折叠所有的树节点。
- ExpandAll(): 展开所有的树节点。
- GetNodeAt(): 返回位于指定点的 TreeNode。
事件
- AfterCheck / BeforeCheck: 在节点的复选框被用户选中或取消选中之后/之前发生。
- AfterSelect / BeforeSelect: 在选择某个节点之后/之前发生。
- AfterCollapse / BeforeCollapse: 在节点被折叠之后/之前发生。
- AfterExpand / BeforeExpand: 在节点被展开之后/之前发生。
- NodeMouseClick: 当鼠标单击 TreeNode 时发生。
节点介绍 - TreeNode
- Name: 节点的唯一标识符。
- Text: 节点显示的文本。
- Nodes: 子节点的集合。
动态加载菜单表
- 数据库中存储节点与子节点的关系,但层次关系不明显。
- 动态加载数据到 TreeView 控件的流程:
- 从数据库获取表数据。
- 使用递归方法创建节点,并添加到 TreeView。
- 调用方法在 TreeView 中创建并显示层次结构数据。
TreeView 节点的勾选处理
- 当父节点勾选或取消勾选时,所有子节点状态跟随变化。
- 任一子节点勾选,父节点也应勾选。
- 所有子节点都未勾选,父节点也不勾选。
TreeView
案例演示
案例一:
namespace WinFormsTest
{
public partial class frmTreeView : Form
{
public frmTreeView()
{
InitializeComponent();
}
private void frmTreeView_Load(object sender, EventArgs e)
{
TreeView fileTree = new TreeView();
// 单独设置 Width 和 Height
fileTree.Width = 200; // 设置宽度为200像素
fileTree.Height = 600; // 设置高度为400像素
// 或者使用 Size 属性同时设置宽度和高度
fileTree.Size = new Size(200, 300); // 宽度200像素,高度400像素
// 开始更新节点,防止在添加节点时进行重绘
fileTree.BeginUpdate();
TreeNode rootNode = new TreeNode("我的电脑");
fileTree.Nodes.Add(rootNode);
// 添加几个文件夹作为子节点
TreeNode documentsNode = new TreeNode("文档");
TreeNode picturesNode = new TreeNode("图片");
TreeNode musicNode = new TreeNode("音乐");
TreeNode videoNode = new TreeNode("视频");
rootNode.Nodes.Add(documentsNode);
rootNode.Nodes.Add(picturesNode);
rootNode.Nodes.Add(musicNode);
rootNode.Nodes.Add(videoNode);
// 完成节点添加后,恢复控件的绘制
fileTree.EndUpdate();
fileTree.AfterSelect += new TreeViewEventHandler(fileTree_AfterSelect);
this.Controls.Add(fileTree);
}
private void fileTree_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Text != "我的电脑")
{
// 当用户选择一个节点时,显示选中节点的信息
MessageBox.Show("选中的文件夹: " + e.Node.Text);
}
}
}
}
效果:
案例二:
using System.Data;
using WinFormsTest.Helper;
namespace WinFormsTest
{
public partial class frmTreeView2 : Form
{
public frmTreeView2()
{
InitializeComponent();
}
private void frmTreeView2_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.判断当前节点下有没有子节点
//这个是递归,直到rows为0即当前节点没有子节点时结束递归
CreateNode(dt, node, int.Parse(node.Name));
}
}
}
/添加父子勾选关联功能
//1.父节点勾选或取消,它的所有子节点与它一致
//2.只要有一个子节点勾选,父节点就勾选
// 子节点全部不勾选,父节点就不勾选
bool isMouseClick = true;
private void treeView1_NodeMouseClick_1(object sender, TreeNodeMouseClickEventArgs e)
{
isMouseClick = false;
//子节点勾选
SetChildNodesState(e.Node);
//父节点勾选
SetParentNodeState(e.Node);
isMouseClick = true;
}
private void treeView1_AfterCheck_1(object sender, TreeViewEventArgs e)
{
if (isMouseClick)
{
treeView1.SelectedNode = 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);
}
}
}
}
效果:
新建一个SQL数据库
展示
添加父子勾选关联功能后
精彩推荐:
【C#进阶一】C#中的数组(Array)、集合(ArrayList,Queue,Stack, HashList)、List<T>、字典(Dictionary<K,T>)和双向链表LinkedList
【C#进阶八】C#中的序列化与反序列化下(二进制序列化、XML序列化及JSON序列化)
【C#进阶】C#语法中一些常用知识点总结
【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox
【WinForm详细教程三】WinForm中的NumericUpDown、PictureBox、RichTextBox及三种Timer控件
【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件
【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件
【WinForm详细教程六】WinForm中的GroupBox和Panel 、TabControl 、SplitContainer控件
【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式
如果你对智能建造专业感兴趣,或者是相关方向的学生,老师或者从业人员,欢迎通过微信公众号【智能建造小硕】加入我们!
希望有所帮助,同时欢迎关注我们,后面将更新更多相关内容!