【问题标题】:TreeView control in C#, select() and focusC# 中的 TreeView 控件、select() 和焦点
【发布时间】:2020-06-17 19:08:46
【问题描述】:

当我在TreeView 中选择Node 时,它会突出显示并显示基于该Node 的数据。当我选择另一个 Control(TreeView 失去焦点)时,它不再突出显示。失去焦点后如何保持突出显示?
在进行搜索时,我无法确定选择了哪个节点,因为我必须将焦点放在文本框上(以便用户可以输入更多文本)。

【问题讨论】:

    标签: c# treeview


    【解决方案1】:

    您必须将 HideSelection 属性设置为 false - 这样您才能看到选择,尽管 TreeView 控件失去焦点

    【讨论】:

    • 我必须补充一点,C# 中实际上有 3 个 TreeView 类:WinForms、ASP.NET 和 WPF。只有 WinForms 控件具有 HideSelection 属性。
    • 这让我想知道为什么 Visual Studio 设计器将true 指定为HideSelection 属性的默认值。我认为在大多数用例中 not 隐藏当前选定的节点是首选。
    【解决方案2】:

    我刚遇到这个问题,我就是这样解决的:将 DrawMode 属性更改为 TreeViewDrawMode.OwnerDrawText 并注册到 DrawNode 事件

     
        private void MyTreeGridview_DrawNode(object sender, DrawTreeNodeEventArgs e) 
        {
            if ((e.State == TreeNodeStates.Selected) && (!MyTreeGridview.Focused))
            {
                Font font = e.Node.NodeFont ?? e.Node.TreeView.Font;
                Color fore = e.Node.ForeColor;
                if (fore == Color.Empty)fore = e.Node.TreeView.ForeColor;      
                fore = SystemColors.HighlightText;
                Color highlightColor = SystemColors.Highlight;
                e.Graphics.FillRectangle(new SolidBrush(highlightColor), e.Bounds);
                ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, fore, highlightColor);
                TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds, fore, highlightColor, TextFormatFlags.GlyphOverhangPadding);
            }
            else
            {
                e.DrawDefault = true;
            }
        }
    

    【讨论】:

      【解决方案3】:

      当 HideSelection 设置为 False 并且 TreeView 失去焦点时,如果突出显示颜色不够亮,无法满足您的喜好:

      确保 TreeView 的 HideSelection 设置为 True(默认值)。

      然后处理 TreeView 的 Enter 和 Leave 事件,例如:

      void myTreeView_Leave(object sender, EventArgs e)
      {
          if((sender as TreeView).SelectedNode != null)
              (sender as System.Windows.Forms.TreeView).SelectedNode.BackColor = Color.Red; //your highlight color
      }
      
      void myTreeView_Enter(object sender, EventArgs e)
      {
          if((sender as TreeView).SelectedNode != null)
              (sender as TreeView).SelectedNode.BackColor = (sender as TreeView).BackColor;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多