C'è un modo per disabilitare AlberoNodo in espansione dopo il doppio clic ??Disattiva espansione dopo doppio clic
Grazie
C'è un modo per disabilitare AlberoNodo in espansione dopo il doppio clic ??Disattiva espansione dopo doppio clic
Grazie
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.
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.
Ciao, Purtroppo I don 't vedere l'azione (come DoubleClick o semplice espandere) in TreViewCancelEventArgs – arek
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.
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;
}
}
}
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. –
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 -.
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 -. –
Questa dovrebbe essere la risposta accettata, poiché non si basa sulla conoscenza dei tempi di doppio clic – Dan
Sono d'accordo che questa dovrebbe essere la risposta esclusa. Ha funzionato in modo impeccabile e semplicissimo da implementare. – Tizz
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;
}
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
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.
modo più semplice: si verificherà
treeList.OptionsBehavior.AllowExpandOnDblClick = false;
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
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;
}
In realtà, ci è un modo molto semplice per raggiungere questo obiettivo. –
@baeltazor: Ho provato la soluzione suggerita nella risposta prima di pubblicare la mia risposta. Vedi i miei commenti sotto la tua risposta. –
È una soluzione abbastanza interessante ma funziona :) Grazie :) – arek