有什么办法可以在双击后禁用扩展TreeNode吗?
由于
答案 0 :(得分:22)
private bool isDoubleClick = false;
private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
{
if (isDoubleClick && e.Action == TreeViewAction.Collapse)
e.Cancel = true;
}
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (isDoubleClick && e.Action == TreeViewAction.Expand)
e.Cancel = true;
}
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
isDoubleClick = e.Clicks > 1;
}
您可以声明私有字段isDoubleClick并如上所述设置各种TreeView事件。这将阻止双击展开/折叠TreeView节点。但是,展开/折叠将通过+和 - 图标起作用。
答案 1 :(得分:13)
据我所知,没有简单的方法可以实现这一目标。一种想法是在DoubleClick事件上将bool
变量设置为true
,并使用e.Cancel
事件的BeforeExpand
属性来阻止节点扩展。但是,这两个事件是以相反的顺序触发的,因此这不是解决方案。我没有另外一个解决方案;如果我想出一个会更新。
<强>更新强>
我已经玩了一下这个,我找到了一种合理的方法。正如我所提到的,问题是BeforeExpand
在 DoubleClick
之前发生,因此我们无法在DoubleClick
中设置任何状态以在BeforeExpand
中使用
然而,我们可以通过另一种方式检测(潜在)双击:通过测量MouseDown
事件之间的时间。如果我们在定义双击的时间段内收到两个MouseDown
事件(如SystemInformation.DoubleClickTime
中所述),则应该是双击,对吧?在MouseDown
之前提出了BeforeExpand
事件。因此,以下代码运行良好:
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;
}
我说“相当不错”,因为我觉得它会阻止节点在某些情况下不应该扩展(例如,如果你在双击时间内首先点击节点文本然后点击加号)。这可能有可能以某种方式解决,或者也许你可以忍受。
答案 2 :(得分:3)
MouseDown事件将在BeforeExpand / BeforeCollapse事件之前发生。您可以检查MouseEventArg的Clicks属性,以区分双击和单击:
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;
}
答案 3 :(得分:2)
处理事件BeforeExpand并将事件args对象的属性设置为true。
private void OnBeforeExpand(object sender, TreeViewCancelEventArgs e)
{
e.Cancel = true;
}
TreeViewCancelEventArgs还包含受影响的节点以及导致该事件的操作,因此您可以实现更复杂的逻辑来启用或禁用扩展行为,而不是我的简单示例。
答案 4 :(得分:2)
是。你可以这样做。
代码中的某个地方写下这个:
bool CanExpand = true;
...在doubleclicked处理程序中写下这个:
CanExpand = false;
.......并且在um ..的BeforeExpand事件中,输入以下内容:
if( CanExpand )
Application.DoEvents();
else e.Cancel = true;
我希望这有帮助。
<小时/> 我刚试过这个,它完美无瑕。 :-)下面是我用来测试它的整个代码。所以你可以看到它是如何工作的:
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;
}
}
}
答案 5 :(得分:1)
我知道这个帖子已经很老了,但现在遇到了同样的问题并找到了替代解决方案。我不确定此线程打开时treeView_blockInfo_NodeMouseDoubleClick
是否可用,但我的解决方案是附加此事件并使用这段代码:
private void treeView_blockInfo_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (!e.Node.IsExpanded)
{
e.Node.Expand();
}
else
{
e.Node.Collapse();
}
}
适合我(虽然我没有深入测试这个)。我能想到的唯一问题是它可能会引起闪烁。
答案 6 :(得分:0)
这是一个简单的解决方案:
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;
}
答案 7 :(得分:0)
尝试改变观点。 除了在双击上禁用展开之外,您还可以仅在用户单击[+]按钮时才允许展开。
这样,您可以使用GetHitTestInfoAt方法,并且仅在单击的元素为htOnButton时才允许扩展。 以下代码适用于Delphi 6:
procedure Form1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
var
p:Tpoint;
ht:THitTests;
begin
p:=Mouse.CursorPos;
ht:=treeview1.GetHitTestInfoAt(treeview1.ScreenToClient(p).x,treeview1.screentoclient(p).y);
AllowExpansion:=(htOnButton in ht);
end;
答案 8 :(得分:-2)
最简单的方法:
treeList.OptionsBehavior.AllowExpandOnDblClick = false;