【问题标题】:Can i grab Click and DoubleClick in a node treeview C#?我可以在节点树视图 C# 中抓取 Click 和 DoubleClick 吗?
【发布时间】:2010-12-24 15:48:00
【问题描述】:

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

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

【问题讨论】:

  • 我强烈警告您不要在双击节点时导致某些操作发生。这是扩展/折叠节点的常用方法,如果您开始连接其他行为,则可能会混淆用户。
  • 另外,如果您可以发布您的TreeViewClickDoubleClick 事件处理程序的代码会更好......问题一定存在于某个地方(也许你是取消点击事件或显示消息框?)因为DoubleClick 事件在一个空的测试应用程序中对我来说非常好。
  • 嗨 Cody,我将代码添加到问题中
  • @Cody Gray 如果节点没有子节点,双击操作完全没问题
  • @voodoomsr,这真的是你的代码吗?您希望如何在消息框中双击?

标签: c# winforms treeview


【解决方案1】:

你可以试试这个方法……但这不是正确的方法

需要一个定时器控件,比如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】:

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

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

    但是,解决方案很简单:从您的事件处理程序中删除 MessageBox.Show 语句,一切都会按预期工作。您需要找到其他方法来提醒用户注意该节点那是被选中的(如果这甚至是必要的),但这将是因祸得福。每次单击节点时都会弹出一个消息框,这并不是一个友好的 UI。对于您的特定场景(至少据我所知),不需要像计时器这样更复杂的技术。

    这也为调试涉及 Windows 用户界面元素的代码提供了重要的一课。任何时候您将MessageBox 加入其中,您都有可能破坏微妙的事件序列。最好的替代方案可能是致电 Debug.WriteLine

    【讨论】:

    • 嘿嘿嘿,我输入的messagebox只是用来测试的,在我的应用程序中没有任何作用,我要输入的真正动作是单击:预览内容它们在我在其他地方的预览 texbox 中表示的基础数据,对于双击,将节点复制到树的根。我再说一遍,mbox 仅用于查看是否有可能同时具有两种行为。
    【解决方案3】:

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

    当您收到 DoubleClick 事件时,将计时器的 Enable 属性设置为 false 并执行双击操作。当您收到 Tick 事件时,将计时器的 Enable 属性设置为 false 并执行单击操作。它不会带来出色的用户界面体验。

    由于消息框,您没有收到 DoubleClick 事件,它使焦点移开。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我尝试过,但它总是首先触发 1 次点击的操作
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多