【问题标题】:Tri-State Checkboxes in WinForms TreeViewWinForms TreeView 中的三态复选框
【发布时间】:2011-04-11 18:51:38
【问题描述】:

我有一个 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 控件上启用三态复选框?

【问题讨论】:

标签: c# winforms treeview


【解决方案1】:

如果您正在考虑绘制混合复选框,此代码可能会对您有所帮助

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);
    }
}

这将呈现:

祝你好运!

【讨论】:

  • 使用 CheckBoxRenderer 是一个很好的技巧——我见过的子类化解决方案使用图像列表。显然,图像不会像直接调用渲染器那样便携。
  • 按照 OP 的要求,如何将它与 TreeView 控件完全配合使用?
【解决方案2】:

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

我现在只是在研究,所以还没有使用它。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 嗯...我碰巧遇到了,但认为它由于某种原因受到了许可限制。顶部有版权声明。但是,经过仔细检查,它可能属于 LGPL。将问题留待一段时间,看看是否还有其他选择。
    猜你喜欢
    • 2011-03-23
    • 2010-10-16
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2010-11-18
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多