2009-08-08 9 views

Respuesta

13

No hay una manera simple de lograr esto, hasta donde yo sé. Un pensamiento sería tener una variable bool establecida en true en el evento de DoubleClick y usar la propiedad e.Cancel del evento BeforeExpand para evitar que el nodo se expanda. Sin embargo, esos dos eventos se disparan en el orden opuesto, por lo que no es una solución. No tengo otra solución desde lo alto de mi cabeza; se actualizará si se me ocurre una.

actualización

he jugado un poco con esto un poco, y he encontrado una manera en que funciona razonablemente también. Como mencioné, el problema es que BeforeExpand ocurre antes deDoubleClick, por lo que no podemos establecer ningún estado en DoubleClick para usar en BeforeExpand.

Podemos, sin embargo, detectar (potenciales) clics dobles de otra manera: midiendo el tiempo entre MouseDown eventos. Si obtenemos dos eventos MouseDown dentro del período de tiempo que define un doble clic (como se indica en SystemInformation.DoubleClickTime), debería hacer doble clic, ¿no? Y el evento MouseDown se produce antes del BeforeExpand. Por lo tanto, el siguiente código funciona bastante bien:

private bool _preventExpand = false; 
private DateTime _lastMouseDown = DateTime.Now; 

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Cancel = _preventExpand; 
    _preventExpand = false; 
} 

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    int delta = (int)DateTime.Now.Subtract(_lastMouseDown).TotalMilliseconds;    
    _preventExpand = (delta < SystemInformation.DoubleClickTime); 
    _lastMouseDown = DateTime.Now; 
} 

digo "bastante bien" porque siento que impide el nodo de la expansión en algunos casos en los que no debería (por ejemplo, si en el plazo de doble click click primero en el texto del nodo y luego en el signo más). Eso podría ser posible resolver de alguna manera, o quizás puedas vivir con eso.

+1

En realidad, hay es una forma muy simple de lograr esto. –

+1

@baeltazor: Probé la solución que sugiere en su respuesta antes de publicar mi respuesta. Vea mis comentarios en su respuesta. –

+1

Es una solución bastante interesante pero funciona :) Gracias :) – arek

2

controla el evento BeforeExpand y establezca la propiedad Cancel del evento args oponerse a la verdadera.

private void OnBeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Cancel = true; 
} 

Los TreeViewCancelEventArgs también contiene el nodo afectado y la acción que causó el evento para que pueda implementar una lógica más sofisticada para activar o desactivar el comportamiento ampliar que mi ejemplo sencillo.

+0

Hola, Desafortunadamente Yo no te vea la acción (como DoubleClick o simplemente ampliar) en TreViewCancelEventArgs – arek

2

Sí. Puedes hacerlo.

En algún lugar por sí mismo en el código escribir esto:

bool CanExpand = true; 

... y dentro del manejador doubleclicked escribir esto:

CanExpand = false; 

....... y dentro de la UM. .el evento BeforeExpand, escriba esto:

if(CanExpand) 
    Application.DoEvents(); 
else e.Cancel = true; 

Espero que esto haya ayudado.


Acabo de probar esto, y funciona sin problemas. :-) A continuación está el código completo que utilicé para probarlo.Así se puede ver cómo funciona:


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     bool CanExpand = true; 

     private void treeView1_DoubleClick(object sender, EventArgs e) 
     { 
      CanExpand = false; 
     } 

     private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
     { 
      if (CanExpand) 
       Application.DoEvents(); 
      else 
       e.Cancel = true; 
     } 
    } 
} 
+1

Acabo de probar esto y muestra un * muy * comportamiento inconsistente (permite la primera expansión en doble clic, ya que 'BeforeExpand' se levanta antes de' DoubleClick', luego bloquea el próximo intento de expansión, independientemente de cómo se desencadene) . Además, su código probablemente debería establecer 'CanExpand = true' en el manejador de eventos' BeforeExpand', o bloqueará todos los futuros intentos de expansión. –

18
private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) 
{ 
    if (blnDoubleClick == true && e.Action == TreeViewAction.Collapse) 
     e.Cancel = true; 
} 

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (blnDoubleClick == true && e.Action == TreeViewAction.Expand) 
     e.Cancel = true; 
} 

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Clicks > 1) 
     blnDoubleClick = true; 
    else 
     blnDoubleClick = false; 
} 

que puede tomar una variable booleana como: blnDoubleClick private bool = false; y establecer varios eventos treeview de la siguiente manera. Esto evitará expandir/colapsar el nodo de vista en árbol con doble clic. Sin embargo, expandir/colapsar funcionará a través de los íconos + y -.

+1

Puede tomar una variable booleana como: private bool blnDoubleClick = false; y configure varios eventos treeview de la siguiente manera. Esto evitará expandir/colapsar el nodo de vista en árbol con doble clic. Sin embargo, expandir/colapsar funcionará a través de los íconos + y -. –

+1

Esta debería ser la respuesta aceptada, ya que no se basa en conocer los tiempos de doble clic – Dan

+0

Acepto que esta debería ser la respuesta exceptuada. Funcionó sin problemas y es súper simple de implementar. – Tizz

0

Aquí es una solución simple:

int treeX; // somewhere in class scope 

// Add a MouseMove event handler 
private void treeView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    treeX = e.X; 
} 

// Add a BeforeExpand event handler 
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (treeX > e.Node.Bounds.Left) e.Cancel = true; 
} 
+0

Me temo que esto evitaría que se expanda cada vez que el mouse esté sobre el nodo (de hecho, ya que solo está comprobando la coordenada x, también podría suceder, cuando el mouse está sobre cualquier otro nodo ...). La expansión solo debe evitarse en caso de doble clic según la pregunta. – MartinStettner

1

Sé que este hilo es bastante antiguo, pero tenía el mismo problema y ahora encontrado solución alternativa. No estoy seguro de si treeView_blockInfo_NodeMouseDoubleClick estaba disponible en el momento en que se abrió este hilo, pero mi solución es unir este evento y utilizar esta pieza de código:

private void treeView_blockInfo_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (!e.Node.IsExpanded) 
    { 
     e.Node.Expand(); 
    } 
    else 
    { 
     e.Node.Collapse(); 
    } 
} 

Obras para mí (aunque yo no estaba poniendo a prueba a este profundidad). El único problema que puedo pensar es que podría causar parpadeo.

-2

manera más simple:

treeList.OptionsBehavior.AllowExpandOnDblClick = false; 
+0

Esta solución no se aplica a un treelist de Winforms. Creo que este [control] (https://documentation.devexpress.com/#windowsforms/DevExpressXtraTreeListTreeList_OptionsBehaviortopic) es lo que utilizó el autor de esta respuesta. – transistor1

3

Un evento MouseDown se producirá antes de los acontecimientos BeforeExpand/BeforeCollapse. Puede comprobar la propiedad clics del MouseEventArg distinguir entre un doble clic y un solo clic:

bool dblClick; 

private void treeView_MouseDown(object sender, MouseEventArgs e) 
{ 
    dblClick = e.Button == MouseButtons.Left && e.Clicks == 2; 
} 

private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (e.Action == TreeViewAction.Expand) e.Cancel = dblClick; 
} 
Cuestiones relacionadas