2009-08-08 6 views

Antwort

13

Es gibt keine einfache Möglichkeit, dies zu erreichen, soweit ich weiß. Ein Gedanke wäre, eine Variable bool für das Ereignis DoubleClick auf true zu setzen und die Eigenschaft e.Cancel des Ereignisses BeforeExpand zu verwenden, um zu verhindern, dass der Knoten expandiert. Diese beiden Ereignisse werden jedoch in der umgekehrten Reihenfolge abgefeuert, so dass dies keine Lösung ist. Ich habe keine andere Lösung von meinem Kopf; werde aktualisiert, wenn ich mir einen ausdenke.

aktualisieren

Ich habe mit diesem ein wenig herumgespielt, und ich habe einen Weg gefunden, die gut vernünftig funktioniert. Wie ich erwähnt habe, ist das Problem, dass passiert vorDoubleClick, so dass wir keinen Zustand in DoubleClick in BeforeExpand verwenden können.

Wir können jedoch (potenzielle) Doppelklicks auf andere Weise erkennen: durch Messen der Zeit zwischen MouseDown Ereignissen. Wenn wir zwei MouseDown Ereignisse innerhalb des Zeitraums erhalten, der einen Doppelklick definiert (wie in SystemInformation.DoubleClickTime angegeben), sollte es ein Doppelklick sein, oder? Und das MouseDown Ereignis wird vor BeforeExpand ausgelöst. So funktioniert der folgende Code recht gut:

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

ich sage „ziemlich gut“, weil ich das Gefühl, dass er den Knoten Expandieren in einigen Fällen verhindert, wenn es nicht (zum Beispiel, wenn Sie innerhalb des Doppelklick Zeit Klick zuerst auf den Knotentext und dann auf das Pluszeichen). Das könnte in irgendeiner Weise gelöst werden, oder vielleicht kannst du damit leben.

+1

Eigentlich gibt, ist eine sehr einfache Möglichkeit, dies zu erreichen. –

+1

@baeltazor: Ich habe die Lösung ausprobiert, die Sie in Ihrer Antwort vorschlagen, bevor Sie meine Antwort posten. Sehen Sie meine Kommentare unter Ihrer Antwort. –

+1

Es ist ziemlich interessante Lösung, aber es funktioniert :) Danke :) – arek

2

Behandelt das Ereignis Before und stellen Sie die Eigenschaft der Veranstaltung args Abbrechen auf true Objekt.

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

Die TreeViewCancelEventArgs enthält auch die betroffenen Knoten und die Aktion, die das Ereignis ausgelöst hat, so dass Sie eine komplexere Logik implementieren können, aktivieren oder erweitert Verhalten als mein einfaches Beispiel zu deaktivieren.

+0

Hallo, Leider don 't I Wirkung (wie Doppelklick oder einfach erweitern) sieht in TreViewCancelEventArgs – arek

2

Ja. Du kannst das.

selbst Irgendwo im Code schreiben dies:

bool CanExpand = true; 

... und innerhalb der doubleclicked Handler schreiben:

CanExpand = false; 

....... und im Inneren des um. Geben Sie folgendes ein:

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

Ich hoffe, das hat geholfen.


Ich habe gerade getestet, und es funktioniert einwandfrei. :-) Unten ist der ganze Code, mit dem ich es getestet habe.So können Sie sehen, wie es funktioniert:


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

Ich habe das gerade ausprobiert und es zeigt ein * sehr * inkonsistentes Verhalten (es erlaubt die erste Erweiterung auf doubleclick, da 'BeforeExpand' vor' DoubleClick' gesetzt wird, dann blockt es den nächsten Expand Versuch, egal wie es ausgelöst wird) . Außerdem sollte Ihr Code wahrscheinlich 'CanExpand = true' zuletzt im' BeforeExpand' Event-Handler setzen, oder er wird alle zukünftigen Erweiterungsversuche blockieren. –

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

Sie eine boolean Variable annehmen kann wie: privat Bool blnDoubleClick = false; und setzen Sie verschiedene Baumansichtsereignisse wie folgt. Dies verhindert, dass der Baumansichtsknoten beim Doppelklicken geöffnet/geschlossen wird. Expand/Collapse funktioniert jedoch über + und - Symbole.

+1

Sie können eine boolesche Variable wie: private bool blnDoubleClick = false; und setzen Sie verschiedene Baumansichtsereignisse wie folgt. Dies verhindert, dass der Baumansichtsknoten beim Doppelklicken geöffnet/geschlossen wird. Expand/Collapse funktioniert jedoch über + und - Symbole. –

+1

Dies sollte die akzeptierte Antwort sein, da es nicht darauf angewiesen ist, die Doppelklickzeiten zu kennen – Dan

+0

Ich stimme zu, dass dies die Ausnahmeantwort sein sollte. Perfekt gearbeitet und super einfach zu implementieren. – Tizz

0

Hier ist eine einfache Lösung:

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

Ich befürchte, dies würde die Expansion verhindern, wenn sich die Maus über dem Knoten befindet (tatsächlich, da Sie nur die x-Koordinate überprüfen, kann es auch passieren, wenn sich die Maus über einem anderen Knoten befindet ...). Nur bei Doppelklicks gemäß der Frage kann eine Erweiterung verhindert werden. – MartinStettner

1

Ich weiß, dieser Thread ist ziemlich alt, aber hatte das gleiche Problem jetzt und alternative Lösung gefunden. Ich bin mir nicht sicher, ob treeView_blockInfo_NodeMouseDoubleClick zur Zeit verfügbar war dieser Thread eröffnet wurde, aber meine Lösung ist es, dieses Ereignis zu befestigen und dieses Stück Code verwenden:

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

Werke für mich (obwohl ich teste dies nicht zu Tiefe). Das einzige Problem, an das ich denken kann, ist, dass es Flimmern verursachen könnte.

-2

einfachste Weg:

treeList.OptionsBehavior.AllowExpandOnDblClick = false; 
+0

Diese Lösung gilt nicht für eine Winforms-Baumstrukturliste. Ich denke, [this] (https://documentation.devexpress.com/#windowsforms/DevExpressXtraTreeListTreeList_OptionsBehaviortopic) Kontrolle ist, was der Autor dieser Antwort verwendet. – transistor1

3

A MouseDown- Ereignis vor dem Before/BeforeCollapse Ereignisse auftreten. Sie können die Klicks Eigenschaft des MouseEventArg überprüfen zwischen einem Doppelklick und mit einem Klick zu unterscheiden:

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