Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在树视图的每个节点旁边添加按钮?_C#_.net_Winforms_Treeview - Fatal编程技术网

C# 如何在树视图的每个节点旁边添加按钮?

C# 如何在树视图的每个节点旁边添加按钮?,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,如何在树视图的每个节点旁添加按钮?在树视图的每个节点旁添加按钮很困难。您必须自己处理树视图的绘制,或者自己绘制按钮并模拟其功能,或者创建子按钮控件并将其显示在树控件中的正确位置,然后在控件滚动时重新定位它们,等等。无论哪种方式,这都将是一场噩梦 幸运的是,有一个简单的方法:你不必做任何复杂的事情,因为你不应该做它们 你见过有按钮的树控件吗?不会。因此,如果树控件中有按钮,最终用户会认为它很奇怪 你应该做的是考虑其他应用程序如何解决了你试图解决的问题,而不必使用树控件中的按钮,并且按照他们的方式去

如何在树视图的每个节点旁添加按钮?

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

幸运的是,有一个简单的方法:你不必做任何复杂的事情,因为你不应该做它们

你见过有按钮的树控件吗?不会。因此,如果树控件中有按钮,最终用户会认为它很奇怪


你应该做的是考虑其他应用程序如何解决了你试图解决的问题,而不必使用树控件中的按钮,并且按照他们的方式去做。

< P>最简单的方法就是自己画树。下面是一个小示例(请注意,PushButtonState位于System.Windows.Forms.VisualStyles命名空间内):


此外,即使不创建自定义控件,也可以实现这一点-只需将这些事件处理程序添加到标准TreeView中即可。。提示您将使用按钮btn=new Button(),现在您必须将其存根到code@DJKRAZE:那不行;他想把它放在树上,这是不可能的;你需要一个第三方的树状视图。很抱歉…我刚刚意识到。。。我相信通过Telerik控制,您应该能够做到这一点,我从经验中知道它们有多强大。。该网站还允许您演示产品。您可能会获得所有这些反对票,因为人们认为您是那些要求源代码解决问题的N00B之一。但我不认为你是,所以我投了更高的票。是的。。。但我需要一个带文本框的。。。糟透了,对吧?我正在创建一个深度复制工具。它需要一个复选框,并且用户能够重命名树下的每个节点:(你确定你需要的文本框数量和树中的节点数量一样多吗?只需要一个文本框,只在需要时创建,然后在你键入后立即销毁如何?它确实添加了按钮。但是,行已消失。我们可以保留行吗?
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;
        }
    }
}