C# WinForms TreeView-如何手动;突出显示“;节点(就像被单击一样)

C# WinForms TreeView-如何手动;突出显示“;节点(就像被单击一样),c#,winforms,treeview,C#,Winforms,Treeview,我需要知道如何让编程选择的节点以图形方式处于“已选择”状态,就像用户单击它一样。SelectedNode仅在内部选中此节点。多谢各位 不确定,但能否更改该节点的背景色?该节点未显示为高亮显示的原因是树视图没有焦点。这是我的测试表单上的按钮单击事件: TreeView1.SelectedNode = TreeView1.Nodes(2); TreeView1.Focus(); 这将正确高亮显示节点。如果删除Focus()call在您点击树状视图(树状视图中的任何位置,不一定在您要选择的节点上)之

我需要知道如何让编程选择的节点以图形方式处于“已选择”状态,就像用户单击它一样。SelectedNode仅在内部选中此节点。多谢各位

不确定,但能否更改该节点的背景色?

该节点未显示为高亮显示的原因是树视图没有焦点。这是我的测试表单上的按钮单击事件:

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

这将正确高亮显示节点。如果删除
Focus()
call在您点击树状视图(树状视图中的任何位置,不一定在您要选择的节点上)之前,它不会高亮显示。

底层Win32控件支持此功能(认为它是
TVIS\u DROPHILITED
),但我看不到通过
TreeView
控件公开的相同功能


正如theraneman所说,你可以用
TreeNode.ForeColor
BackColor
属性来伪装它…

这对我来说适用于.net 3.5: 将treeview组件的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;

我不知道它是否对您有帮助,但检查页面的taborder并确保树视图控件的tab顺序为0

我遇到了类似的问题,希望在表单加载时选择一个
TreeView
节点(突出显示)。 也许有人也有同样的问题

我首先尝试了Pondidum的解决方案。没有成功。 但后来我在另一个线程中找到了解决方案:只需将
TreeView
TabIndex
设置为0。 在这种情况下,您不需要设置焦点。只需使用
SelectedNode
选择应该选择的节点,然后设置
TabIndex
。就这样

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

上述解决方案只会将焦点放在它上面,但不会改变它的突出显示视图。

以下是我的工作:

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回答了如何突出显示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;
  }
}
Windows 10中的Platform=C#.NET 4.5,Visual Studio 2015

TreeView1.SelectedNode = TreeView1.Nodes(2);
this.ActiveControl = TreeView1;

这对我来说是可行的(.net 4.7)

这可能会有问题,我需要确保在选择其他节点时将其设置回原来的位置,等等。尝试此操作后,我发现在拖动时,树会闪烁很多。也可以使用HideSelection属性。如果设置为false,则无论焦点如何,都会显示高光。这有一些缺点。我们一直在使用类似的方法,但是发现如果用户取消拖动,则选择了错误的节点。我们尝试跟踪最后一个选择此项的节点,并在dragleave中重新选择,但如果拖动,列表将滚动到原始项。@Goran:这就是我要找的!为什么默认情况下这
是正确的
?这对我来说确实有效,谢谢!我稍微修改了代码:
TreeView1.SelectedNode.BackColor=SystemColors.Highlight
TreeView1..SelectedNode.ForeColor=SystemColors.HighlightText这很好,因为它即使在以编程方式选择的节点显示
TreeView1.SelectedNode.IsSelected==false时也能工作。很抱歉,我需要对答案1和答案6进行评论,答案应该是节点[2]而不是节点(2)答案#4放置节点[2]。我之所以这样说,是因为我无法对现有答案进行评论,因为我缺少代表点。更重要的是,我认为我们都会检查第一个答案,因为它的分数最高。当我们尝试代码但它不起作用时,我们会转到较低的答案或其他帖子。这是一个有10年历史的问题。这并不是说我会在这里得到任何观点:我只是希望你能纠正这两个答案中的错误并删除我的帖子,这样无论谁决定尝试他们的代码,都不会面临这样的问题。tha