2009-08-08 16 views

risposta

13

Non c'è un modo semplice per raggiungere questo obiettivo, per quanto ne so. Si potrebbe pensare di avere una variabile bool impostata su true sull'evento DoubleClick e utilizzare la proprietà e.Cancel dell'evento BeforeExpand per impedire l'espansione del nodo. Tuttavia, questi due eventi vengono sparati nell'ordine opposto, quindi non è una soluzione. Non ho un'altra soluzione dalla cima della mia testa; aggiornerà se ne trovo uno.

Aggiornamento

Ho giocato in giro con questo un po ', e ho trovato un modo che funziona ragionevolmente bene. Come ho accennato, il problema è che prima delloDoubleClick, quindi non è possibile impostare alcuno stato in DoubleClick da utilizzare in BeforeExpand.

Tuttavia, è possibile rilevare (potenziali) doppi clic in un altro modo: misurando il tempo tra gli eventi MouseDown. Se otteniamo due eventi MouseDown entro il periodo di tempo che definisce un doppio clic (come indicato in SystemInformation.DoubleClickTime), dovrebbe essere un doppio clic, giusto? E l'evento MouseDown viene generato prima dello BeforeExpand. Così, il seguente codice funziona piuttosto bene:

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

dico "piuttosto bene", perché sento che impedisce il nodo di espandersi in alcuni casi, quando non dovrebbe (per esempio se all'interno il doppio click tempo click prima sul testo del nodo e poi sul segno più). Potrebbe essere possibile risolvere in qualche modo, o forse si può vivere con quello.

+1

In realtà, ci è un modo molto semplice per raggiungere questo obiettivo. –

+1

@baeltazor: Ho provato la soluzione suggerita nella risposta prima di pubblicare la mia risposta. Vedi i miei commenti sotto la tua risposta. –

+1

È una soluzione abbastanza interessante ma funziona :) Grazie :) – arek

2

gestisce l'evento BeforeExpand e impostare la proprietà Cancel di argomenti oggetto evento su true.

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

I TreeViewCancelEventArgs contiene anche il nodo interessato e l'azione che ha causato l'evento in modo da poter implementare una logica più sofisticata per attivare o disattivare il comportamento espandere che il mio semplice esempio.

+0

Ciao, Purtroppo I don 't vedere l'azione (come DoubleClick o semplice espandere) in TreViewCancelEventArgs – arek

2

Sì. Puoi farlo.

qualche parte per sé nel codice scrivendo questo:

bool CanExpand = true; 

... e all'interno del gestore doubleclicked scrivere questo:

CanExpand = false; 

....... e all'interno um. . l'evento BeforeExpand, digitare questo:

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

Spero che questo abbia aiutato.


Ho appena provato questo, e funziona perfettamente. :-) Di seguito è riportato l'intero codice che ho usato per testarlo.Così si può vedere come funziona:


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

Ho appena provato questo e mostra un comportamento * molto * incoerente (consente la prima espansione su doubleclick, poiché 'BeforeExpand' viene sollevato prima di' DoubleClick', quindi blocca il successivo tentativo di espansione, indipendentemente da come viene attivato) . Inoltre, il tuo codice dovrebbe probabilmente impostare l'ultima volta 'CanExpand = true' nel gestore di eventi' BeforeExpand', altrimenti bloccherà tutti i futuri tentativi di espansione. –

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

si può prendere una variabile booleana del tipo: bool blnDoubleClick privato = false; e impostare vari eventi TreeView come segue. Ciò impedirà l'espansione/compressione del nodo treeview con un doppio clic. Tuttavia, l'espansione/compressione funzionerà tramite le icone + e -.

+1

Puoi prendere una variabile booleana come: private bool blnDoubleClick = false; e impostare vari eventi di vista ad albero come segue. Ciò impedirà l'espansione/compressione del nodo treeview con un doppio clic. Tuttavia, l'espansione/compressione funzionerà tramite le icone + e -. –

+1

Questa dovrebbe essere la risposta accettata, poiché non si basa sulla conoscenza dei tempi di doppio clic – Dan

+0

Sono d'accordo che questa dovrebbe essere la risposta esclusa. Ha funzionato in modo impeccabile e semplicissimo da implementare. – Tizz

0

Ecco una soluzione semplice:

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

Ho paura che questo impedisca l'espansione ogni volta che il mouse si trova sopra il nodo (infatti, poiché stai solo controllando la coordinata x, potrebbe anche succedere, quando il mouse si trova su qualsiasi altro nodo ...). L'espansione può essere evitata solo in caso di doppio clic in base alla domanda. – MartinStettner

1

So che questa discussione è piuttosto vecchio, ma aveva lo stesso problema ora e trovato una soluzione alternativa. Non sono sicuro se treeView_blockInfo_NodeMouseDoubleClick era disponibile al momento è stato aperto questa discussione, ma la mia soluzione è quella di collegare questo evento e utilizzare questo pezzo di codice:

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

funziona per me (anche se non ero prove a profondità). L'unico problema che posso pensare è che potrebbe causare lo sfarfallio.

-2

modo più semplice: si verificherà

treeList.OptionsBehavior.AllowExpandOnDblClick = false; 
+0

Questa soluzione non si applica a un elenco di finestre Winforms. Penso che [questo] (https://documentation.devexpress.com/#windowsforms/DevExpressXtraTreeListTreeList_OptionsBehaviortopic) controllo sia l'autore di questa risposta. – transistor1

3

evento A MouseDown prima degli eventi BeforeExpand/BeforeCollapse. È possibile controllare la proprietà Clic del MouseEventArg di distinguere tra un doppio e un singolo 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; 
} 
Problemi correlati