C # Winforms bold treeview node ne montre pas le texte entier

j'utilise le code suivant pour faire mes treenodes bold:

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

mais le texte des noeuds gras n'est pas affiché correctement. La dernière lettre(s) ne sont pas affichés. Comment venir? Et comment résoudre ce problème?

52
demandé sur Martijn 2010-02-16 14:31:18

13 réponses

j'ai trouvé ce Post lors de la recherche sur le web parce que je suis confronté au même problème.

cependant, ajouter un espace blanc à l'extrémité du noeud n'était pas une option, et j'ai trouvé une autre façon qui semble corriger le problème.

après avoir défini ma police de noeud en gras, tout ce que je dois faire est de réinitialiser le texte du noeud avec la même valeur.

voici le code échantillon:

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

il semble que le nœud est redessiné après la modification du texte, ce qui est exactement ce que je voulais en premier lieu.

58
répondu BlunT 2013-02-14 17:33:56

j'ai trouvé qu'il s'agit d'un problème Windows. Voici une solution pour contourner ce problème:

dans la forme constructor définit la police de treeview en gras. Lors de l'ajout de noeuds qui ne doivent pas être en gras, changez la police en régulière:

// 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);
16
répondu Martijn 2010-02-16 12:14:50

c'est un bug connu de Windows. La solution simple est juste d'ajouter un caractère d'espace supplémentaire à la fin de vos cordes. Le caractère d'espace ne sera pas visible, mais il augmentera le nombre de pixels nécessaires pour dessiner la chaîne, de sorte que la chaîne entière sera visible.

5
répondu Adel Hazzah 2010-06-26 04:00:50

tout cela ne m'aide pas. Ce qui a fait le truc c'est de rendre la police un peu plus grosse et audacieuse au moment du DESIGN. (Dans la fenêtre Propriétés)

donc assurez-vous de définir la vue sur arbre avec une police assez grande, puis plus tard vous pouvez ajouter des noeuds avec une police plus petite. Ils s'intègrent.

3
répondu Bappie 2012-11-13 07:26:37

je suis d'accord avec la solution proposée. Je veux juste ajouter que pour faire un peu de lumière sur le problème. La treview a sa propre police qui détermine la largeur des éléments au niveau de la racine. Cela compense le fait qu'il n'y a qu'une propriété de hauteur d'article disponible et aucune propriété de largeur d'article.

la solution à votre problème est de déterminer quelle police de votre noeud racine devrait être, puis de définir l'arbre à cette même police. Vous pouvez le faire la conception du temps aussi.

Espère que ça aide quelqu'un.

3
répondu user3161309 2014-01-04 21:37:13

utilisez simplement treeView.BeginUpdate () avant de baliser le noeud puis treeView.Endurpdate () après avoir mis le noeud en gras.

3
répondu YoungStacker 2016-12-28 21:10:21

une solution à ce problème est la suivante:

définit la police defaul de treeview en gras dans les propriétés.

Et chnage de ne pas en gras lorsque vous en avez besoin.

2
répondu Ismael 2014-07-15 11:32:51

basé sur MSDN Library , essayez de changer votre code en:

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

Il travailler pour moi

1
répondu Romi Ardiansya 2018-01-28 12:07:15

très facile et fonctionne bien

treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
           this.treeView1.SelectedNode.Text += string.Empty;
0
répondu Kilus 2012-07-28 08:49:32

je réalise que c'est un vieux fil et il peut avoir été répondu. Je viens de rencontrer ce problème que je suis en train d'apprendre à utiliser TreeViews. Ce qui a fonctionné pour moi était de changer la taille de la police pour L'ensemble de TreeView à la même taille, ou plus grande que la police du niveau que vous voulez gras. La taille par défaut de la police est de 8.quelque. J'ai changé le mien à 10, qui était la taille que je voulais mes noeuds, et la troncature avait disparu.

0
répondu 2016-02-01 16:11:03

ce qui a fonctionné pour moi: accrocher dans l'événement de charge dans le constructeur de la commande et ajuster le noeud comme expliqué dans la réponse de 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";
    };
}
0
répondu sean.net 2016-08-24 13:14:42

c'est dans vb.Net cependant, la solution pour entrer de nouveau la valeur du champ de texte s'en sort bien. Comme dans:

 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
0
répondu planetblu 2016-10-20 15:10:43

je fais ce qui suit, je mets L'événement DrawNode à appeler, il met le noeud en gras et supprime la couleur mise en évidence.

vous pouvez définir n'importe quelle couleur que vous aimez en utilisant le premier paramètre du e. Graphics.Fonction 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);
}

maintenant quand je sélectionne un noeud j'obtiens 20 pixels plus d'espace, pour ma police, cela fonctionne bien, on peut calculer la taille "réelle" nécessaire, mais il n'y a pas de spécification indiquant qu'il doit le faire, mais vous pouvez utiliser Graphique.Mesuretring si vous sentez que vous avez besoin de faire cela.

0
répondu Computer Aided Trading Systems 2017-11-22 13:37:02