当Node赋初始值时,给控件绘制三种状态。

This commit is contained in:
chenliang624 2021-09-24 14:43:57 +08:00
parent 8f3b1bccbb
commit 7ec8b634e0

View File

@ -712,6 +712,7 @@ namespace Sunny.UI
g.Dispose();
}
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
base.OnDrawNode(e);
@ -720,6 +721,17 @@ namespace Sunny.UI
try
{
if (!DicNodeStatus.ContainsKey(e.Node.GetHashCode()))
{
DicNodeStatus.Add(e.Node.GetHashCode(), false);
}
if (CheckBoxes)
{
if (e.Node.Parent != null && DicNodeStatus.ContainsKey(e.Node.Parent.GetHashCode()) && !DicNodeStatus[e.Node.Parent.GetHashCode()])
{
SetParentNodeCheckedState(e.Node);
}
}
if (BorderStyle == BorderStyle.Fixed3D) BorderStyle = BorderStyle.FixedSingle;
if (e.Node == null || e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)
@ -728,6 +740,7 @@ namespace Sunny.UI
}
else
{
var drawLeft = (e.Node.Level + 1) * Indent + 3;
var checkBoxLeft = (e.Node.Level + 1) * Indent + 1;
var imageLeft = drawLeft;
@ -750,6 +763,7 @@ namespace Sunny.UI
var checkboxColor = ForeColor;
if (e.Node != null)
{
if (e.Node == SelectedNode)
{
e.Graphics.FillRectangle((e.State & TreeNodeStates.Hot) != 0 ? HoverColor : SelectedColor,
@ -788,6 +802,8 @@ namespace Sunny.UI
if (CheckBoxes)
{
if (!e.Node.Checked)
{
e.Graphics.DrawRectangle(checkboxColor,
@ -811,11 +827,6 @@ namespace Sunny.UI
}
}
if (!DicNodeStatus.ContainsKey(e.Node.GetHashCode()))
{
DicNodeStatus.Add(e.Node.GetHashCode(), false);
}
if (DicNodeStatus[e.Node.GetHashCode()])
{
//var location = e.Node.Bounds.Location;
@ -930,17 +941,18 @@ namespace Sunny.UI
DicNodeStatus[e.Node.GetHashCode()] = false;
SetChildNodeCheckedState(e.Node, e.Node.Checked);
if (e.Node.Parent != null)
SetParentNodeCheckedState(e.Node, true);
}
}
private void SetParentNodeCheckedState(TreeNode currNode, bool ByMouse = false)
{
SetParentNodeCheckedState(e.Node);
}
}
}
private void SetParentNodeCheckedState(TreeNode currNode)
{
if (currNode.Parent == null)
return;
TreeNode parentNode = currNode.Parent; //获得当前节点的父节点
var count = parentNode.Nodes.Cast<TreeNode>().Where(n => n.Checked).ToList().Count;
@ -958,19 +970,21 @@ namespace Sunny.UI
DicNodeStatus[parentNode.GetHashCode()] = false;
}
if (ByMouse)
{
var g = CreateGraphics();
OnDrawNode(new DrawTreeNodeEventArgs(g, parentNode,
new Rectangle(0, parentNode.Bounds.Y, Width, parentNode.Bounds.Height), TreeNodeStates.Hot));
g.Dispose();
if (parentNode.Parent != null) //如果父节点之上还有父节点
{
SetParentNodeCheckedState(parentNode); //递归调用
SetParentNodeCheckedState(parentNode, ByMouse); //递归调用
}
}
}
//选中节点之后,选中节点的所有子节点
private void SetChildNodeCheckedState(TreeNode currNode, bool state)
@ -986,6 +1000,8 @@ namespace Sunny.UI
}
}
}
}
}
}