Gibt es eine Möglichkeit, expanding TreeNode nach Doppelklick deaktivieren ??Erweiterung nach Doppelklick deaktivieren
Dank
Gibt es eine Möglichkeit, expanding TreeNode nach Doppelklick deaktivieren ??Erweiterung nach Doppelklick deaktivieren
Dank
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.
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.
Hallo, Leider don 't I Wirkung (wie Doppelklick oder einfach erweitern) sieht in TreViewCancelEventArgs – arek
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.
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;
}
}
}
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. –
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.
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. –
Dies sollte die akzeptierte Antwort sein, da es nicht darauf angewiesen ist, die Doppelklickzeiten zu kennen – Dan
Ich stimme zu, dass dies die Ausnahmeantwort sein sollte. Perfekt gearbeitet und super einfach zu implementieren. – Tizz
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;
}
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
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.
einfachste Weg:
treeList.OptionsBehavior.AllowExpandOnDblClick = false;
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
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;
}
Eigentlich gibt, ist eine sehr einfache Möglichkeit, dies zu erreichen. –
@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. –
Es ist ziemlich interessante Lösung, aber es funktioniert :) Danke :) – arek