2011-12-29 379 views
6

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

+2

你到目前为止有什么代码..提示你将使用Button btn = new Button()现在你必须将它存根在你的代码中 – MethodMan 2011-12-29 19:56:30

+0

@DJKRAZE:那不行;他希望在树视图中。 – SLaks 2011-12-29 19:59:16

+0

这是不可能的;你需要一个第三方的TreeView。 – SLaks 2011-12-29 19:59:31

回答

10

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

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

你有没有见过带按钮的树控件?不可以。因此,如果您的树形控件中包含按钮,最终用户将会看到它很奇怪。

你应该做的是考虑其他应用程序如何解决你正在尝试解决的问题,而不使用带有按钮的树控件,并像他们一样做。

+1

这似乎公平。谢谢。 – Seva 2011-12-29 20:06:22

+0

是的......但我需要一个带有文本框......糟透了吗?我正在创建一个深层复制工具。它需要一个复选框,并且用户可以在树上重命名每个节点。 :( – LightStriker 2012-11-21 21:09:10

+0

你确定你需要的树的节点数尽可能多吗?怎么样只有一个文本框,只在需要的时候创建,并在你完成输入后立即销毁? – 2012-11-22 22:51:42

3

这里就是我发现在CodeProject上的源代码项目,其中有人已实际完成一个网站它是什么,你正在尝试做的..希望这会帮助你

How to put buttons inside a treeview 这是一个CodeProject上的链接项目实际上有来源与工作项目一起去。祝你好运

+1

+1提供一个实际的回答这个问题,但我认为文章中按钮treeview截图的怪异进一步加强了我自己的观点。 – 2011-12-29 20:59:01

+0

谢谢..我同意.. – MethodMan 2011-12-29 21:06:50

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

相关问题