2011-04-06 28 views
5

Tengo el control TreeView en winform. Deseo hacer varios nodos no seleccionables. ¿Cómo puedo lograr esto?
Solo tengo una idea en mente: los nodos dibujados a medida, pero ¿existe una forma más fácil? Por favor consejo yonodo no seleccionable en TreeView

ya he dicho código en tratar manejador BeforeSelect evento:

private void treeViewServers_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (e.Node.Parent != null) 
    { 
    e.Cancel = true; 
    } 
} 

pero el efecto que ganó no es apropiado. Selección de selección temporal del nodo cuando estoy presionando el botón izquierdo del mouse sobre ella.

¡Gracias de antemano!

Respuesta

4

Puede deshabilitar por completo los eventos del mouse en caso de que haga clic en un nodo no seleccionable.

Para hacer esto, usted tiene que anular TreeView una muestra en el siguiente código de

public class MyTreeView : TreeView 
{ 
    int WM_LBUTTONDOWN = 0x0201; //513 
    int WM_LBUTTONUP = 0x0202; //514 
    int WM_LBUTTONDBLCLK = 0x0203; //515 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDOWN || 
      m.Msg == WM_LBUTTONUP || 
      m.Msg == WM_LBUTTONDBLCLK) 
     { 
      //Get cursor position(in client coordinates) 
      Int16 x = (Int16)m.LParam; 
      Int16 y = (Int16)((int)m.LParam >> 16); 

      // get infos about the location that will be clicked 
      var info = this.HitTest(x, y); 

      // if the location is a node 
      if (info.Node != null) 
      { 
       // if is not a root disable any click event 
       if(info.Node.Parent != null) 
        return;//Dont dispatch message 
      } 
     } 

     //Dispatch as usual 
     base.WndProc(ref m); 
    } 
} 
+0

Gran! ¡También agregué filtración para el botón derecho y ahora mi vista de árbol funciona perfectamente! ¡Muchas gracias! –

+1

¿Qué sucede si el usuario selecciona el nodo usando las teclas de teclado (arriba, abajo, izquierda, derecha)? – Thunder

+4

El código en mi publicación simplemente cancela la selección en caso de clics del mouse, que no son manejados por el código en la pregunta. Pero para la selección de teclas, basta con cancelar el evento en treeViewServers_Before event (o en OnBeforeSelect si lo anulas). Por supuesto, necesita combinar ambos códigos para evitar por completo la selección. – digEmAll

Cuestiones relacionadas