双击后禁用扩展

时间:2009-08-08 16:45:26

标签: c# .net winforms

有什么办法可以在双击后禁用扩展TreeNode吗?

由于

9 个答案:

答案 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;