【问题标题】:How do I add a button beside each node of a TreeView?如何在 TreeView 的每个节点旁边添加一个按钮?
【发布时间】:2011-12-29 19:53:53
【问题描述】:

如何在 TreeView 的每个节点旁边添加一个按钮?

【问题讨论】:

  • 到目前为止你有什么代码......提示你将使用 Button btn = new Button() 现在你必须在你的代码中存根它
  • @DJKRAZE:那行不通;他希望它树视图中。
  • 这是不可能的;您需要第三方 TreeView。
  • 对此感到抱歉..我刚刚意识到...我相信使用 Telerik 控件,您应该能够做到这一点,我从经验中知道它们有多强大.. 网站还可以让您演示产品还有
  • 你可能得到了所有这些反对意见,因为人们认为你是那些出现要求源代码解决他们问题的 n00bs 之一。但我不认为你是,所以我投了赞成票。

标签: c# .net winforms treeview


【解决方案1】:

在树视图的每个节点旁边添加一个按钮很困难。您必须自己处理树视图的绘制,或者自己绘制按钮并模拟它们的功能,或者创建子按钮控件并将它们显示在树控件中的正确位置,然后在控件滚动时处理它们的重新定位等。不管怎样,这将是一场噩梦。

幸运的是,有一个简单的方法:您不必做任何复杂的事情,因为您不应该这样做!

您见过带有按钮的树形控件吗?不会。因此,如果您的树形控件中有按钮,您的最终用户会觉得它很奇怪。

您应该做的是考虑其他应用程序如何在不使用带有按钮的树形控件的情况下解决您尝试解决的问题,并照他们做的那样做。

【讨论】:

  • 是的...但是我需要一个带文本框的...很烂对吧?我正在创建一个深拷贝工具。它需要一个复选框,并且用户能够重命名树下的每个节点。 :(
  • 您确定需要与树中的节点一样多的文本框吗?只有一个文本框,只在需要时创建,并在您输入完成后立即销毁?
【解决方案2】:

最简单的方法是自己画树。这是一个小例子(请注意 PushButtonState 位于 System.Windows.Forms.VisualStyles 命名空间内):

public class CustomTreeView : TreeView
{
    private Rectangle buttonRect = new Rectangle(80, 2, 50, 26);
    private StringFormat stringFormat;

    public CustomTreeView()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        DrawMode = TreeViewDrawMode.OwnerDrawText;
        ShowLines = false;
        FullRowSelect = true;
        ItemHeight = 30;

        stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Near;
        stringFormat.LineAlignment = StringAlignment.Center;
    }

    protected override void OnDrawNode(DrawTreeNodeEventArgs e)
    {
        e.Graphics.DrawString(e.Node.Text, this.Font, new SolidBrush(this.ForeColor), e.Bounds, stringFormat);
        ButtonRenderer.DrawButton(e.Graphics, new Rectangle(e.Node.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size), "btn", this.Font, true, (e.Node.Tag != null) ? (PushButtonState)e.Node.Tag : PushButtonState.Normal);
    }

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {
        if (e.Node.Tag != null && (PushButtonState)e.Node.Tag == PushButtonState.Pressed)
        {
            e.Node.Tag = PushButtonState.Normal;
            MessageBox.Show(e.Node.Text + " clicked");
            // force redraw
            e.Node.Text = e.Node.Text;
        }
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        TreeNode tnode = GetNodeAt(e.Location);
        if (tnode == null) return;

        Rectangle btnRectAbsolute = new Rectangle(tnode.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size);
        if (btnRectAbsolute.Contains(e.Location))
        {
            tnode.Tag = PushButtonState.Pressed;
            tnode.Text = tnode.Text;
        }
    }
}

此外,即使不创建自定义控件,您也可以实现这一点 - 只需将这些事件处理程序添加到标准 TreeView

【讨论】:

  • 它确实添加了按钮。然而,线条不见了。我们可以保持线路吗?
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2019-12-20
  • 2020-01-29
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多