刚接触c#,项目中用到Treeview实现三态,即选中、未选中、半选中状态,并且要求父子节点选择联动,效果类似下图
网上有很多例子,于是研究了一下,结合网上大佬们的例子,所以在这里记录一下。
首先新建一个Winform工程拖个TreeView控件,然后运行。。。
嗯。。。加点数据吧。
private void CreateTree()
{
TreeNode anime = new TreeNode("2018一月新番");
var china = anime.Nodes.Add("国创");
pointer = china.Nodes.Add("一人之下");
pointer = china.Nodes.Add("狐妖小红娘");
pointer = china.Nodes.Add("妖神记");
pointer = china.Nodes.Add("斗罗大陆");
var nihonn = anime.Nodes.Add("日本");
pointer = nihonn.Nodes.Add("OVERLORD");
pointer = nihonn.Nodes.Add("龙王的工作");
pointer = nihonn.Nodes.Add("紫罗兰永恒花园");
pointer = nihonn.Nodes.Add("魔卡少女樱");
pointer = nihonn.Nodes.Add("博多豚骨拉面团");
this.LaoYeZha_TreeView.Nodes.Add(anime);
}
运行。。
ok,然后考虑节点选择联动,先考虑选中一个节点,子节点全选中,取消选择,子节点全都不选中。
添加treeview的AfterCheck事件。
private void LaoYeZha_TreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
//只处理鼠标点击引起的状态变化
if(e.Action == TreeViewAction.ByMouse)
{
//更新子节点状态
UpdateChildNodes(e.Node);
}
}
private void UpdateChildNodes(TreeNode node)
{
foreach (TreeNode child in node.Nodes)
{
child.Checked = node.Checked;
UpdateChildNodes(child);
}
}
现在实现了子节点联动了,接下来是父节点
在AfterCheck事件中添加方法
private void LaoYeZha_TreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
//只处理鼠标点击引起的状态变化
if(e.Action == TreeViewAction.ByMouse)
{
//更新子节点状态
UpdateChildNodes(e.Node);
//更新父节点状态
UpdateParents(e.Node);
}
}
private void UpdateParents(TreeNode node)
{
var parent = node.Parent;
while (parent != null)
{
//设置父节点状态
SetNode