2011-12-29 48 views

Respuesta

10

Agregar un botón al lado de cada nodo de una vista de árbol es difícil. Tendría que manejar el dibujo de la vista de árbol usted mismo, y dibujar los botones usted mismo y emular su funcionalidad, o crear controles de botón secundarios y mostrarlos en los lugares correctos dentro del control de árbol y luego manejar reposicionarlos cuando el control se desplaza, etc. De cualquier forma, va a ser una pesadilla.

Afortunadamente, hay una salida fácil: no tienes que hacer ninguna de esas cosas complicadas, ¡PORQUE NO DEBES HACERLOS!

¿Alguna vez has visto un control de árbol con botones en él? No. Por lo tanto, si su control de árbol tiene botones, los usuarios finales lo considerarán extraño.

Lo que debe hacer es considerar cómo otras aplicaciones han resuelto el problema que se está tratando de resolver sin necesidad de utilizar controles de árbol con botones en ellos, y hacen lo que hacen.

+1

que parece justo. Gracias. – Seva

+0

Sí ... Pero necesito uno con cuadros de texto ... ¿Chupas, verdad? Estoy creando una herramienta de copia profunda. Necesita una casilla de verificación y la capacidad del usuario para cambiar el nombre de cada nodo en el árbol. :( – LightStriker

+0

¿Estás seguro de que necesita la mayor cantidad de cuadros de texto, ya que hay nodos en el árbol? ¿Qué tal un solo cuadro de texto, sólo se crea cuando sea necesario, y destruida tan pronto como haya terminado de escribir en ella? –

3

Aquí es un sitio donde he encontrado proyecto de código fuente en CodeProject en la que alguien realmente ha logrado lo que sea que usted está tratando de hacer .. espero que esto le ayudará a

How to put buttons inside a treeview Este es un CodeProject vincular el proyecto en realidad tiene una fuente para ir junto con el proyecto de trabajo. buena suerte

+1

1 para proporcionar una efectiva Respondo a la pregunta, pero creo que la rareza de las capturas de pantalla del botón treeview en el artículo fortalece aún más mi propio punto. –

+0

gracias ... y estoy de acuerdo ... – MethodMan

2

La forma más sencilla de hacerlo es dibujar el árbol mismo. He aquí un pequeño ejemplo (tenga en cuenta que se encuentra en el interior PushButtonState System.Windows.Forms.VisualStyles espacio de nombres):

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

Además, se puede lograr esto incluso sin crear controles personalizados - sólo tiene que añadir estos controladores de eventos a nivel TreeView

Cuestiones relacionadas