WinForms TreeView中的三态复选框

时间:2011-04-11 18:51:38

标签: c# winforms treeview

我有一个TreeView,允许用户通过选中或取消选中每个项目的复选框来选择分层数据的某些元素。目前,我在使用checkbox hiding technique from another question的孩子的节点上禁用该框,如下所示:

☑ 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中可用,我的问题是如何在不自己绘制框的情况下执行此操作(例如,作为用户绘制的控件或using an image list)。我根本不熟悉Win32 API;如何扩展上面链接的技术以在托管的TreeView控件上启用三态checbox?

3 个答案:

答案 0 :(得分:13)

如果您考虑绘制混合复选框

,此代码可能会对您有所帮助
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 :(得分:9)

Code Project现在有一个整洁的解决方案,Tri-State Tree View

我现在正在研究,所以尚未使用它。

答案 2 :(得分:2)

你看过this了吗?它似乎做了这个工作。它可能有点陈旧,(看起来这篇文章是从2004年开始的),但我确信同样的原则可以扩展到你需要做的任何事情。