Подтвердить что ты не робот

WinForms TreeView - как вручную "выделить" node (например, было нажато)

Мне нужно знать, как сделать программно выбранный node графически отображаемым в выбранном состоянии, как пользователь, нажавший на него. SelectedNode только делает это внутренне выбранным. Большое вам спасибо!

4b9b3361

Ответ 1

Причина, по которой он не отображается как выделенный, обусловлен отсутствием фокуса древовидной структуры. Это событие нажатием кнопки в моей тестовой форме:

TreeView1.SelectedNode = TreeView1.Nodes(2);
TreeView1.Focus();

Что выделяет node правильно. если вы удалите вызов Focus();, он не выделяется до тех пор, пока вы не нажмете на древовидное представление (в любом месте древовидного представления, не обязательно на node, который вы хотите выбрать).

Ответ 2

Это работает для меня для .net 3.5: Задайте свойство DrawMode компонента древовидного дерева: OwnerDrawAll Затем в событии DrawNode напишите следующее:

 if (((e.State & TreeNodeStates.Selected) != 0) && (!MyTreeView.Focused))
     e.Node.ForeColor = Color.Blue;
else
     e.DrawDefault = true;

И в событии BeforeSelect есть:

if (MyTreeView.SelectedNode != null)
    MyTreeView.SelectedNode.ForeColor = Color.Black;
e.Node.ForeColor = Color.Blue;

Ответ 3

TreeView1.SelectedNode.BackColor = SystemColors.HighlightText; // This will work

Выше решения будут только фокусироваться на нем, но не изменят его подсветку.

Ответ 4

Я не знаю, помогает ли это вам или нет, но проверьте вкладку на странице и убедитесь, что элемент управления древовидной структурой имеет порядок вкладок 0

Ответ 5

Подчиненный элемент управления Win32 поддерживает это (думаю, он TVIS_DROPHILITED), но я не вижу той же функции, которая отображается с помощью элемента управления TreeView.

Как говорит theraneman, вы можете подделать его с помощью свойств TreeNode.ForeColor и BackColor...

Ответ 6

У меня была аналогичная проблема и я хотел иметь TreeView node выбранный (выделенный) при загрузке формы. Возможно, у кого-то тоже есть проблема.

Сначала я попробовал решение Pondidum. Безуспешно. Но затем я нашел решение в другом потоке: просто установите TabIndex для TreeView равным 0. В этом случае вам не нужно устанавливать фокус. Просто выберите node, который следует выбрать с помощью SelectedNode и установите TabIndex. Что это.

Ответ 7

Вот что я получил:

void myProcedure()
{
  // Hookup a DrawMode Event Handler
  this.myTV.DrawNode += myTV_DrawNode;
  // Set DrawMode and HideSelection
  this.myTV.DrawMode = TreeViewDrawMode.OwnerDrawText;
  this.myTV.HideSelection = false;

  // Make sure the TreeView has Focus
  this.myTV.Focus();
  // Make sure the TreeView is Selected
  this.myTV.Select();
  // If the TreeView has a Node, I want to select the first Node to demonstrate.
  if (this.myTV.Nodes.Count > 0)
  {
    // Make sure the node is visible
    this.myTV.Nodes[0].EnsureVisible();
    // Make sure the Node is Selected
    this.myTV.SelectedNode = myTV.Nodes[0];
  }
  // Make sure the SelectedNode IS the Node that we programmatically want to select.
  textBox1.Text = this.myTV.SelectedNode.Text;
  // if we display sanityCheck1 string, it actually is the correct node.text
  // Make sure .NET runtime knows the Node is selected
  textBox1.Text += "  is Selected = " + this.myTV.SelectedNode.IsSelected.ToString();
}

Следующее: laalto ответил на вопрос, как HighLight TreeView.Node. Следующий код обработчика событий DrawNode, от samball, правильно выделяет TreeView.Node на основе выбранного состояния.

private void myTV_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
  // first, let .NET draw the Node with its defaults
  e.DrawDefault = true;
  // Now update the highlighting or not
  if (e.State == TreeNodeStates.Selected)
  {
    e.Node.BackColor = SystemColors.Highlight;
    e.Node.ForeColor = SystemColors.HighlightText;
  }
  else
  {
    e.Node.BackColor = ((TreeView)sender).BackColor;
    e.Node.ForeColor = ((TreeView)sender).ForeColor;
  }
}

Платформа = С#.NET 4.5 в Windows 10, Visual Studio 2015

Ответ 8

Не уверен, но не можете ли вы изменить цвет фона этого node?