Могу ли я получить Click и DoubleClick в виде дерева узлов C #? - PullRequest
2 голосов
/ 24 декабря 2010

Я пытаюсь определить различные обработчики для событий щелчка и двойного щелчка в узле в 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;
        }
    }

Ответы [ 5 ]

2 голосов
/ 24 декабря 2010

вы можете попробовать этот метод ... но это неправильный способ

нужен таймер, скажем, 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 голосов
/ 24 декабря 2010

Как я и подозревал, проблема в том, что вы показываете MessageBox на событии Click. Когда отображается это окно сообщения, оно «захватывает» все вводимые данные (окна сообщений являются модальными диалоговыми окнами), и второй щелчок пользователя по TreeView не распознается.

Ответ Ханса Пассанта уже содержит подробное объяснение того, как Windows определяет, является ли событие щелчка Click или DoubleClick, поэтому я не буду перефразировать это здесь.

Однако решение состоит в том, чтопросто: Удалите операторы MessageBox.Show из ваших обработчиков событий, и все будет работать как положено. Вам нужно будет найти какой-то другой способ оповещения пользователя о выбранном узле (если это даже необходимо), но это окажется скрытым благословением.Окно сообщения, появляющееся при каждом нажатии на узел, не совсем дружественный пользовательский интерфейс.Для вашего конкретного сценария (по крайней мере, насколько я могу судить) нет необходимости в более сложных техниках, таких как таймер.

Это также представляет собой важный урок по отладке кода, включающего элементы пользовательского интерфейса Windows.Каждый раз, когда вы добавляете MessageBox в микс, вы рискуете нарушить тонкую последовательность событий.Лучшая замена для замены - это, вероятно, вызов Debug.WriteLine.

1 голос
/ 24 декабря 2010

Это умышленно, вы всегда сначала получаете событие Click, когда пользователь дважды щелкает.Знание того, что она намеревалась дважды щелкнуть, требует машины времени.Вы можете создать его, запустить таймер в событии Click и установить для его интервала значение SystemInformation.DoubleClickTime + 45.

При получении события DoubleClick установите для свойства таймера Enable значение false и выполните действие двойного щелчка.Когда вы получите событие Tick, установите для свойства таймера Enable значение false и выполните действие одним щелчком мыши.Это не очень удобно для пользователя.

Вы не получили событие DoubleClick из-за окна сообщения, оно отвлекает внимание.

0 голосов
/ 24 декабря 2010

Если вы удалите обработчик щелчка из кода выше, то обработчик двойного щелчка должен сработать. Поскольку обработчик щелчков отображает диалоговое окно, второй щелчок двойным щелчком не может достичь обработчика двойного щелчка.

0 голосов
/ 24 декабря 2010

Вы можете проверить количество кликов в обработчике событий Click.Это должно быть в экземпляре EventArgs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...