【问题标题】:WinForms TreeView - how to manually "highlight" node (like it was clicked)WinForms TreeView - 如何手动“突出显示”节点(就像它被点击一样)
【发布时间】:2010-12-22 18:25:24
【问题描述】:

我需要知道如何让以图形方式选择的节点以图形方式处于“已选择”状态,就像用户单击它一样。 SelectedNode 只在内部选择这个。非常感谢!

【问题讨论】:

  • 对不起,但我需要评论答案 1 和 6 应该是 node[2] 而不是 node (2) 答案 #4 put node[2] 我之所以这么说是因为我可以' t 评论现有答案,因为我缺乏代表点。更重要的是,我认为我们都会检查第一个答案,因为它的分数最高。当我们尝试代码但它不起作用时,我们会转到较低的答案或另一篇文章。这是一个有 10 年历史的问题。这不像我会在这里得到任何分数:D 我只是希望你能在这两个答案中修复那个错误并删除我的帖子,这样任何决定尝试他们的代码的人都不会面临这样的问题。你

标签: c# winforms treeview


【解决方案1】:
TreeView1.SelectedNode = TreeView1.Nodes(2);
this.ActiveControl = TreeView1;

这对我有用(.net 4.7)

【讨论】:

    【解决方案2】:

    这是我要工作的内容:

    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、Visual Studio 2015 中的 C# .NET 4.5

    【讨论】:

      【解决方案3】:
      TreeView1.SelectedNode.BackColor = SystemColors.HighlightText; // This will work
      

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

      【讨论】:

      • 这实际上对我有用,谢谢!我稍微改了一下代码:TreeView1.SelectedNode.BackColor = SystemColors.Highlight;TreeView1..SelectedNode.ForeColor = SystemColors.HighlightText;
      • 这很好,因为即使以编程方式选择的节点显示 TreeView1.SelectedNode.IsSelected == false
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这适用于.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;
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            底层 Win32 控件支持这一点(认为是 TVIS_DROPHILITED),但我看不到通过 TreeView 控件公开的相同功能。

            正如 theraneman 所说,您可以使用 TreeNode.ForeColorBackColor 属性来伪造它...

            【讨论】:

              【解决方案8】:

              它没有显示为突出显示的原因是树视图没有焦点。这是在我的测试表单上的按钮单击事件中:

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

              正确突出显示节点。如果您删除 Focus(); 调用,则它不会突出显示,直到您单击树视图(树视图中的任何位置,不一定在您要选择的节点上)。

              【讨论】:

              • 也可以使用属性 HideSelection。如果设置为 false,则无论焦点如何,都会显示高亮。
              • 这有一些缺点。我们一直在使用类似的方法,但是发现如果用户取消拖动,则选择了错误的节点。我们尝试跟踪最后一个节点选择了这个并在dragleave中重新选择,但是如果你拖出,列表会滚动到原始项目。
              • @Goran:这就是我要找的!为什么默认是true??
              【解决方案9】:

              不确定,但你能不改变那个节点的背景颜色吗?

              【讨论】:

              • 这会有问题,我需要确保在选择其他节点等时将其设置回来。
              • 尝试这个我发现我在拖动时得到了很多树的闪烁。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-02-01
              • 2011-05-11
              • 2011-02-14
              • 2022-07-23
              • 1970-01-01
              • 2011-06-08
              • 1970-01-01
              相关资源
              最近更新 更多