Об управлении деревом - PullRequest
       0

Об управлении деревом

0 голосов
/ 15 апреля 2011

Я использовал событие нажатия кнопки мыши в древовидной структуре. И я хочу установить выбранный узел в качестве узла, на котором произошло событие нажатия мыши. Как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Событие MouseDown наступает до выбора узла.Попробуйте вместо этого обработать событие AfterSelect.Если e.Action установлено на TreeViewAction.ByMouse, то событие было вызвано мышью.

0 голосов
/ 15 апреля 2011

Здесь на ум приходит пара вариантов. Оба вполне могут быть излишними, но они все же решают проблему.

  1. Обработайте событие MouseDown и используйте метод HitTest , чтобы определить, на каком узле щелкнул пользователь. Если они щелкнули действительный узел, вручную установите фокус на этот узел с помощью свойства SelectedNode .

    private void myTreeView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            myTreeView.SelectedNode = myTreeView.HitTest(e.Location).Node;
        }
    }
    
  2. Решение в стиле базуки заключается в переопределении метода WndProc и прослушивании сообщений WM_RBUTTONDOWN. Я сделал это в своей собственной расширенной версии элемента управления TreeView, потому что он позволяет мне исправить некоторые мелочи, которые обычные, не одержимые люди, вероятно, не заметят. Я отвечаю на мучительную деталь в своем ответе здесь .

    По сути, вы делаете то же самое, что и приведенный выше код, но на более низком уровне, который не дает нативному элементу управления тянуть некоторые махинации с фокусом. Я не помню, действительно ли они применимы здесь (отсюда и потенциальный перебор), но мне лень запускать Visual Studio, чтобы убедиться в этом.

    public class FixedTreeView : System.Windows.Forms.TreeView
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            const int WM_RBUTTONDOWN = 0x204;
            if (m.Msg == WM_RBUTTONDOWN)
            {
                Point mousePos = this.PointToClient(Control.MousePosition);
                this.SelectedNode = this.GetNodeAt(mousePos);
            }
            base.WndProc(ref m);
        }   
    }
    

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

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