У меня есть элемент управления TreeView, показывающий несколько узлов TreeNodes в организованной иерархии. Я хочу, чтобы пользователь не выбирал узлы самого высокого уровня (это было достигнуто с помощью события BeforeSelect). Я также хочу, чтобы TreeView не выделял узлы верхнего уровня, если пользователь выбирает их, то есть не позволяет TreeView изменять цвет фона узла и «выбирать» его.
Я использую TreeView - это версия элемента управления WinForms.
Ниже приведен исходный код, который я сейчас пытаюсь использовать:
private void tree_BeforeSelect ( object sender, TreeViewCancelEventArgs e )
{
if ( e.Node.Level == 0 )
{
e.Cancel = true;
}
}
Это отменяет выбор узла, но только после заметной вспышки (~ 200 мс), что нежелательно.





Если выбор отменяется установкой для Cancel значения true в аргументах событий BeforeSelect, узел не будет выбран, и, следовательно, цвет фона не изменится.
Хотя не особо заметно. Что происходит, так это то, что он щелкает узел, узел выбирается, когда кнопка все еще нажата, затем выбор отклоняется, и узел отменяется, когда кнопка мыши поднимается.
В дополнение к существующему коду, если вы добавляете обработчик к событию MouseDown в TreeView с кодом и выбираете узел, используя его местоположение, вы можете затем установить цвета узлов.
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
TreeNode tn = treeView1.GetNodeAt(e.Location);
tn.BackColor = System.Drawing.Color.White;
tn.ForeColor = System.Drawing.Color.Black;
}
По-прежнему существует небольшая проблема, заключающаяся в том, что контур выбора все еще отображается на MouseDown, но он, по крайней мере, останавливает синий фон и продвигает вас немного дальше.
HTH
Один выстрел
Это хорошее решение, но лучше всего использовать Color.FromKnownColor(KnownColor.Window); и Color.FromKnownColor(KnownColor.WindowText);.
Этот код предотвращает рисование выделения до его отмены:
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
treeView1.BeginUpdate();
}
private void treeView1_MouseUp(object sender, MouseEventArgs e)
{
treeView1.EndUpdate();
}
+1, потому что именно так мы избегаем мерцания в WinForms.
Это действительно должен быть ответ!
Если вы нажмете кнопку мыши на TreeView, а затем отойдете от него, прежде чем отпустить кнопку мыши, ваш TreeView застрянет в непригодном для использования состоянии ...
Это просто неправильно. Как вы можете видеть в вопросе, он делает именно это, но цвет фона все равно меняется.