我可以在节点树视图C#中抓取Click和DoubleClick吗?

时间:2010-12-24 15:48:01

标签: c# winforms treeview

我正在尝试为TreeView中的节点中的单击和双击事件定义不同的处理程序,但是始终触发click事件并忽略double。 我可以同时工作吗?

尝试1

    private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        MessageBox.Show(e.Node.Text.ToUpper());
    }
    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        MessageBox.Show(e.Node.Text);
    }

try2

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        switch (e.Clicks)
        {
            case 1:
                MessageBox.Show(e.Node.Text); break;
            case 2:
                MessageBox.Show(e.Node.Text.ToUpper()); break;
            default:
                break;
        }
    }

5 个答案:

答案 0 :(得分:2)

我怀疑,问题是你在MessageBox事件上显示Click当显示该消息框时,它“占用”所有输入(消息框是模态对话框),并且用户对TreeView的第二次点击无法识别。

Hans Passant's answer已经详细解释了Windows如何确定点击事件是Click还是DoubleClick,所以我不会在此处重复。

但是,解决方案很简单:从事件处理程序中删除MessageBox.Show语句,一切都会按预期工作。您需要找到一些其他方法来提醒用户被选中的节点(如果这是必要的话),但这将成为伪装的祝福。每次单击节点时弹出的消息框都不是友好的UI。对于您的特定情况(至少我能说的最好),不需要更复杂的技术,如计时器。

这也是调试涉及Windows用户界面元素的代码的一个重要的更大课程。每当你将MessageBox扔进混音时,你就有可能打破一系列微妙的事件。最好的直接替换可能是调用Debug.WriteLine而不是。

答案 1 :(得分:2)

你可以尝试这种方法......但这不是一种正确的方法

需要一个定时器控制,比如说timer1,设置间隔为500.

timer1.Interval = 500;

声明一个变量来检查鼠标点击

static int mClick = 0;
鼠标中的

private void treeView1_MouseDown(object sender, MouseEventArgs e)
        {
            mClick++;
            timer1.Enabled = true;
        }

在计时器滴答

private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            if (mClick == 1)
            {
                mClick = 0;
                MessageBox.Show("single click");

            }
            if (mClick == 2)
            {
                mClick = 0;
                MessageBox.Show("double click");
            }

        }

这在我身边正常运作。

休息取决于你...

答案 2 :(得分:1)

这是设计使用,当用户双击时,始终首先获取Click事件。知道她打算双击需要一台时间机器。您可以创建一个,在Click事件中启动一个Timer,并将其Interval设置为SystemInformation.DoubleClickTime + 45。

获取DoubleClick事件后,将计时器的“启用”属性设置为false,然后执行双击操作。获取Tick事件时,将计时器的Enable属性设置为false并执行单击操作。它不具备出色的用户界面体验。

由于消息框,您没有收到DoubleClick事件,因此它将焦点拉开。

答案 3 :(得分:0)

您可以在Click事件处理程序中检查点击次数。它应该在EventArgs实例中。

答案 4 :(得分:0)

如果从上面的代码中删除单击处理程序,则应触发双击处理程序。因为单击处理程序显示一个对话框,所以双击的第二次单击无法到达双击处理程序。