Проблемы выбора TreeNode в C # - PullRequest
1 голос
/ 16 января 2011

Всякий раз, когда я щелкаю за пределами текста узлов дерева, на управляющей части, он вызывает событие щелчка узла, но не выделяет узел.Я не уверен, почему это происходит.

Я хочу, чтобы узел выбирался по щелчку - когда вы щелкаете текст узла, а не пробел - я только предполагаю, что ширина узлов достигает всего Treenode?У меня есть Treeview в режиме dock.fill, если это как-то связано с этим - я попробовал все, но не могу заставить его вести себя правильно.

Может быть, кто-то узнает, что происходит.

Обновление: if (e.Location.IsEmpty) {

Кажется, работает лучше - но все равно выбирает узел в пустом месте, где нет текста - Очевидно, ширина узла распространяется на все древовидное представление, как кажется?

Есть ли лучший способ выполнить то, что я хочу?Или это лучший способ?

ОБНОВЛЕНИЕ: Предыдущая идея не работает - вздохнул - я думал, что это удалось, но это не удалось.

Новая проблема: я думаю, что часть проблемы связана с фокусом сейчас, когда я переключаюсь с дерева.

UPDATE-

Единственный код, который мне пришло в голову при отключении щелчка правой кнопкой мыши для выбора узла на событии beforeSelect, это

 if (MouseButtons == System.Windows.Forms.MouseButtons.Right)
            {
                e.Cancel = true;

            }

Но это не сработало - любойпомощь приветствуется - следующие предложения только ответ, для более подробной информации.

Ответы [ 2 ]

3 голосов
/ 16 января 2011

Вы должны использовать метод treeView.HitTest, чтобы определить, какая часть узла была нажата.

private bool IsClickOnText(TreeView treeView, TreeNode node, Point location)
{
    var hitTest = treeView1.HitTest(location);

    return hitTest.Node == node
        && hitTest.Location == TreeViewHitTestLocations.Label;
}

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if(IsClickOnText(treeView1, e.Node, e.Location))
    {
        MessageBox.Show("click");
    }
}

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    if (e.Action == TreeViewAction.ByMouse)
    {
        var position = treeView1.PointToClient(Cursor.Position);        
        e.Cancel = !IsClickOnText(treeView1, e.Node, position);
    }
}
0 голосов
/ 16 января 2011

Используйте события .AfterSelect и / или .BeforeSelect для обработки обработки выбора вместо события .Click.Тогда он будет выбирать узел только при нажатии на текст, и не будет срабатывать .AfterSelect или .BeforeSelect при нажатии на пустое пространство.

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