C#Winforms粗体树视图节点不显示全文

时间:2010-02-16 11:31:19

标签: c# winforms treeview

我正在使用以下代码使我的treenodes变为粗体:

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);

foreach (QuestionnaireBuilder_Category cat in categories)
{
    TreeNode node = new TreeNode();

    node.Text = cat.Description;
    node.Name = cat.Id.ToString();

    node.NodeFont = font;

    tvQuestionSequence.Nodes.Add(node);
}

但粗体节点的文本未正确显示。最后一个字母未显示。怎么会?以及如何解决这个问题?

13 个答案:

答案 0 :(得分:60)

我在网上搜索时找到了这篇帖子,因为我遇到了同样的问题。

但是,在节点末尾添加空格不是一种选择,我找到了一种似乎可以解决问题的替代方法。

设置节点字体Bold后,我需要做的就是重置具有相同值的节点文本。

以下是代码示例:

Font boldFont = new Font(treeview.Font, FontStyle.Bold);
node.NodeFont = boldFont;
node.Text = node.Text;

似乎在更改文本后重新绘制了节点,这正是我想要的。

答案 1 :(得分:17)

我发现这是一个Windows问题。解决此问题的方法是:

在表单构造函数中,将树视图的字体设置为粗体。添加不能为粗体的节点时,请将字体更改为常规:

// Constructor of your form
public Form() 
{
    InitializeComponent();

    Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);
    tvQuestionSequence.Font = font;
}

// Add regular nodes (not bold)
Font font = new Font(tvQuestionSequence.Font, FontStyle.Regular);

TreeNode treeNode = new TreeNode();
treeNode.Text = "Foo";
treeNode.NodeFont = font;

TreeNode parent = tvQuestionSequence.Nodes.Find("parent", true);
parent.Nodes.Add(treeNode);

答案 2 :(得分:6)

在粗体化节点之后,只需使用treeView.BeginUpdate(),然后在粗体化节点后使用treeView.EndUpdate()。

答案 3 :(得分:5)

这是一个已知的Windows错误。 简单的解决方案是在字符串的末尾附加一个额外的空格字符。空格字符将不可见,但会增加绘制字符串所需的像素数,因此整个字符串将可见。

答案 4 :(得分:3)

这对我没有帮助。 在设计时使字体变得更大更大胆的原因是什么? (在“属性”窗口中)

因此,请确保使用足够大的字体定义树视图,然后您可以添加具有较小字体的节点。它们适合。

答案 5 :(得分:3)

我同意所提供的解决方案。我只是想补充一点,以便更清楚地了解问题所在。 树视图有自己的字体,用于确定根级别的项目宽度。这补偿了只有一个项目高度属性可用且没有项目宽度属性的事实。

问题的解决方案是确定根节点的字体应该是什么,然后将树设置为相同的字体。你也可以在设计时做到这一点。

希望有人帮助。

答案 6 :(得分:2)

此问题的解决方法是:

在属性中将树视图的默认字体设置为粗体。

当你需要时,改为不粗体。

答案 7 :(得分:1)

我执行以下操作,将DrawNode事件设置为调用,它将节点设置为粗体并删除突出显示的颜色。

您可以使用e.Graphics.FillRectangle函数的第一个参数设置您喜欢的任何颜色。

private void SetNodeBoldWhenSelected(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node == null) return;
    var font = e.Node.NodeFont ?? e.Node.TreeView.Font;
    if (e.Node.IsSelected)
    {
        font = new Font(font, FontStyle.Bold);                
    }

    var bounds = new Rectangle( e.Bounds.X,e.Bounds.Y,e.Bounds.Width+20,e.Bounds.Height);

    e.Graphics.FillRectangle(SystemBrushes.ControlDarkDark, bounds);
    TextRenderer.DrawText(e.Graphics, e.Node.Text, font, bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding);
}

现在,当我选择一个节点时,我的空间增加了20个像素,对于我的字体,这很有效,人们可以计算出真实的"需要的大小,但没有说明它需要这样做但你可以使用Graphics.MeasureString,如果你觉得你需要这样做。

答案 8 :(得分:1)

根据MSDN Library,尝试将您的代码更改为:

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);

foreach (QuestionnaireBuilder_Category cat in categories)
{
    TreeNode node = new TreeNode();

    node.Text = cat.Description;
    node.Name = cat.Id.ToString();

    node.NodeFont = font;

    tvQuestionSequence.BeginUpdate();  //added newline here  <--
    tvQuestionSequence.Nodes.Add(node);
    tvQuestionSequence.EndUpdate();  //added newline here <--
}

它适合我

答案 9 :(得分:0)

非常简单,工作正常

treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
           this.treeView1.SelectedNode.Text += string.Empty;

答案 10 :(得分:0)

我意识到这是一个旧线程,它可能已被回答。我刚刚学习使用TreeViews时遇到了这个问题。对我有用的是将整个TreeView的字体大小更改为相同大小,或者大于要加粗的级别的字体。默认字体大小为8.something。我将我改为10,这是我想要我的节点的大小,并且截断已经消失。

答案 11 :(得分:0)

对我有用的东西:按照BlunT的答案,在Control的构造函数中加入load事件并调整节点。

public MyControl()
{
    InitializeComponent();
    _head = new TreeNode();

    this.Load += (s, e) =>
    {
        trvParts.Nodes.Clear();
        _head.NodeFont = new Font(trvParts.Font, FontStyle.Bold);
        trvParts.Nodes.Add(_head);
        _head.Text = "Node Name";
    };
}

答案 12 :(得分:0)

它在vb.Net中然而,重新输入TEXT字段值的解决方案很好地解决了这个问题。如:

 With myNode
        Dim myText As String = .Text 'capture the text
        .NodeFont = New Font(<name of your treeview>.Font, FontStyle.Bold)
        .Text = myText 'reset the text to the original value
 End With