WinForms TreeView中的三态复选框

14

我有一个TreeView,让用户通过选中或取消每个项目的复选框来选择分层数据的某些元素。目前,我使用另一个问题中的复选框隐藏技术来禁用具有子节点的节点上的复选框,如下所示:

☑ Node 1
☐ Node 2
• Node 3
  ☑ Node 3.1
  ☑ Node 3.2
• Node 4
  ☐ Node 4.1
  ☑ Node 4.2

但更好的解决方案是使用三态复选框来表示父节点,如下所示:

☑ Node 1
☐ Node 2
☑ Node 3
  ☑ Node 3.1
  ☑ Node 3.2
☒ Node 4
  ☐ Node 4.1
  ☑ Node 4.2

由于Win32中已经提供了此功能,我的问题是如何在不自己绘制框(例如,作为用户绘制控件或使用图像列表)的情况下完成此操作。我对Win32 API一点都不熟悉;如何扩展上面链接的技术以在托管的TreeView控件上启用三态复选框?


这个问题与之前的类似,但在重复查找器中没有显示出来:https://dev59.com/DU7Sa4cB1Zd3GeqP3nfo - Philip Hanson
3个回答

12

如果你想要绘制混合复选框,这段代码可能会对你有所帮助。

class MixedCheckBox:Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(0, 0), Bounds, 
            Text, Font, false, 
            System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal);
    }
}
这将呈现出: enter image description here。祝你好运!

1
使用CheckBoxRenderer是一个好的技巧--我看到的子类解决方案使用图像列表。显然,与直接调用渲染器相比,图像不会像调用渲染器那样便携。 - Philip Hanson
2
那么,如何像 OP 问的那样在 TreeView 控件中精确使用它呢? - Deilan
Winforms的treeview绝对不允许对显示的复选框进行子类化,所以这个答案不是一个解决方案。 - undefined

12

现在在Code Project上有一个看起来非常不错的解决方案,名为三态树形视图

我目前只是在研究中,还没有使用过它。


2
你看过这个吗?它似乎可以完成你的工作。虽然这篇文章是2004年的,但我相信其中的原则可以扩展到任何你需要做的事情。

嗯...我偶然发现了它,但是认为它因某种原因受到许可限制。在顶部有版权声明。不过仔细检查后,它可能是LGPL许可下的。将保持问题开放一段时间,以查看是否有其他选项。 - Philip Hanson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接