Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winforms bold treeview节点不';不显示全文_C#_Winforms_Treeview - Fatal编程技术网

C#Winforms bold treeview节点不';不显示全文

C#Winforms bold treeview节点不';不显示全文,c#,winforms,treeview,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(

我使用以下代码将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);
}

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

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

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

// 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);

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

我在网上搜索时发现了这篇文章,因为我面临着完全相同的问题

然而,在节点的末尾附加一个空格并不是一个选项,我找到了一种似乎可以解决这个问题的替代方法

将节点字体设置为粗体后,我需要做的就是用相同的值重置节点文本

以下是代码示例:

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

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

非常简单,工作正常

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

这对我毫无帮助。 设计时的技巧是使字体更大、更粗体。 (在“属性”窗口中)


因此,请确保使用足够大的字体定义treeview,然后可以使用较小的字体添加节点。它们会合适的。

我同意提供的解决方案。我只想补充一点,让大家更清楚问题出在哪里。 treeview有自己的字体,用于确定根级别的项目宽度。这弥补了只有“项目高度”属性可用而没有“项目宽度”属性的事实

问题的解决方案是确定根节点的字体,然后将树设置为相同的字体。您也可以在设计时这样做


希望这能帮助别人

此问题的解决方法是:

在属性中将treeview的默认字体设置为粗体


当你需要的时候,请不要加粗。

我意识到这是一条老线索,可能已经得到了回答。我在学习使用TreeView时遇到了这个问题。对我来说,有效的方法是将整个TreeView的字体大小更改为相同的大小,或者大于您想要加粗的级别的字体。默认字体大小是8.5左右。我将我的更改为10,这是我想要的节点大小,而截断就不存在了。

对我有效的方法是:在控件的构造函数中挂接load事件,并按照BlunT的回答调整节点

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";
    };
}

它在vb.Net中,但是重新输入文本字段值的解决方案很好地解决了这个问题。例如:

 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
使用myNode的

将myText设置为字符串=.Text'捕获文本
.NodeFont=新字体(.Font,FontStyle.Bold)
.Text=myText'将文本重置为原始值
以

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

我执行以下操作,我将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,如果您觉得需要这样做。

基于此,请尝试将代码更改为:

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 <--
}
Font-Font=新字体(tvQuestionSequence.Font,FontStyle.Bold);
foreach(问题重新构建分类中的类别)
{
TreeNode=新的TreeNode();
node.Text=cat.Description;
node.Name=cat.Id.ToString();
node.NodeFont=font;

tvQuestionSequence.BeginUpdate()的;//此处添加了换行符请记住,
Font
实现了
IDisposable
,因此当不再需要它时,应该始终调用它的
Dispose
方法。因此,您可能应该将
Font
创建为一个字段,并确保在
Dispose
中调用它的
Dispose
方法>
Form
@AdamRalph的方法,在退出构造函数时,
font
的Dispose方法不会被自动调用吗?或者我误解了什么?我认为在上面的示例中,字体存储为treeview的一个属性,treeview将由表单处理,treeview将依次处理字体。我假设是这样的,因为表单设计器为控件分配了新字体,而没有处理它们。只需在更改节点字体之前使用treeView.BeginUpdate(),然后使用treeView.EndUpdate()即可更改节点fontI后,我必须设置字体,将节点添加到树中,然后重置文本以使其正常工作。如果我设置字体,并在将文本添加到树中之前重置文本,则文本仍然会被截断。这是一个比现有答案更好的修复方法,因为它更正了大小问题,而不是简单地过度调整格式副本的大小用更宽的字体覆盖节点区域。如果您已经使用并继承了treenode,那么它也很容易实现。如果字体为粗体,则可以简单地对属性进行阴影处理以重新应用文本。这修复了一个非常令人沮丧的问题,谢谢。此方法在树视图可见时最有效。对于某些树views它不起作用。一个解决方法是--在树视图已经可见时更改节点文本。SO社区更喜欢解释您为什么以及如何以这种方式解决问题。因此,如果您能够解释为什么要这样做,您的帖子将更有价值。感谢您提供此代码片段,它可能会提供一些有限的简短说明rm帮助。