WinForm TreeView如何在节点文本后展示对应子节点数量
WinForm TreeView 节点后展示子节点总数实现方案
不需要完全自定义TreeView控件,有两种可直接落地的实现方式:
- 方案1:直接拼接
TreeNode.Text属性(最简便)
无需额外重绘逻辑,仅需在节点绑定、子节点新增/删除操作时,将子节点总数拼接至原节点文本末尾即可,参考代码:treeNode.Text = $"{originalNodeText} ({treeNode.Nodes.Count})";
若子节点为动态增删,可在AfterNodeAdd、AfterNodeRemove事件触发时,同步更新对应父节点的Text属性即可。该方案优点是无额外适配成本,缺点是计数文本与原节点文本共用样式,无法单独调整颜色、字号等属性。 - 方案2:重写
TreeView.DrawNode事件实现样式分离
若需要让计数文本与原节点文本的展示样式差异化(比如计数显示为灰色、斜体、小字号),仅需开启TreeView的自绘模式即可,无需完全自定义控件:- 首先将TreeView的
DrawMode属性设置为TreeViewDrawMode.OwnerDrawText - 订阅
DrawNode事件,在事件逻辑中分别绘制原节点文本与计数文本,参考代码:
该方案可以完全自定义计数的展示样式,性能与原生控件几乎无差异,适配成本极低。private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) { // 保留节点默认背景、选中态绘制逻辑 e.DrawDefault = true; // 绘制原节点文本 Font nodeFont = e.Node.NodeFont ?? treeView1.Font; TextRenderer.DrawText(e.Graphics, e.Node.Text, nodeFont, e.Bounds.Location, e.Node.ForeColor); // 计算原文本宽度,偏移后绘制计数文本 Size textSize = TextRenderer.MeasureText(e.Node.Text, nodeFont); string countText = $" ({e.Node.Nodes.Count})"; Font countFont = new Font(treeView1.Font.FontFamily, treeView1.Font.Size - 1, FontStyle.Italic); TextRenderer.DrawText(e.Graphics, countText, countFont, new Point(e.Bounds.X + textSize.Width, e.Bounds.Y), Color.Gray); } - 首先将TreeView的
补充说明:如果需要统计的是节点所有层级的后代节点总数而非直接子节点数,自行实现递归计数方法替换代码中的
e.Node.Nodes.Count即可。
内容的提问来源于stack exchange,提问作者Jens Slofstra
相关产品推荐
相关产品推荐

