невыбираемый узел в TreeView - PullRequest
6 голосов
/ 06 апреля 2011

У меня есть элемент управления TreeView на winform.Я хочу сделать несколько узлов невыбираемыми.Как мне этого добиться.
В моей голове есть только одна идея - пользовательские нарисованные узлы, но может быть, существует более простой способ?Пожалуйста, посоветуйте мне

Я уже пробовал такой код в BeforeSelect обработчике событий:

private void treeViewServers_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
  if (e.Node.Parent != null)
  {
    e.Cancel = true;
  }
}

Но полученный эффект не подходит.Узел временно получает выбор, когда я держу на нем левую кнопку мыши.

Заранее спасибо!

1 Ответ

5 голосов
/ 06 апреля 2011

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

Для этого вам нужно переопределить TreeView a, как показано в следующем коде

public class MyTreeView : TreeView
{
    int WM_LBUTTONDOWN = 0x0201; //513
    int WM_LBUTTONUP = 0x0202; //514
    int WM_LBUTTONDBLCLK = 0x0203; //515

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN ||
           m.Msg == WM_LBUTTONUP ||
           m.Msg == WM_LBUTTONDBLCLK)
        {
            //Get cursor position(in client coordinates)
            Int16 x = (Int16)m.LParam;
            Int16 y = (Int16)((int)m.LParam >> 16);

            // get infos about the location that will be clicked
            var info = this.HitTest(x, y);

            // if the location is a node
            if (info.Node != null)
            {
                // if is not a root disable any click event
                if(info.Node.Parent != null)
                    return;//Dont dispatch message
            }
        }

        //Dispatch as usual
        base.WndProc(ref m);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...