web-dev-qa-db-fra.com

Le nœud d'arborescence en gras C # Winforms n'affiche pas le texte entier

J'utilise le code suivant pour rendre mes treenodes en gras:

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 nœuds en gras ne s'affiche pas correctement. La ou les dernières lettres ne sont pas affichées. Comment venir? Et comment résoudre ce problème?

54
Martijn

J'ai constaté qu'il s'agit d'un problème Windows. Une solution de contournement pour ce problème est la suivante:

Dans le constructeur de formulaire, définissez la police de l'arborescence sur gras. Lorsque vous ajoutez des nœuds 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);
19
Martijn

J'ai trouvé ce message lors d'une recherche sur le Web, car je suis confronté au même problème.

Cependant, ajouter un espace blanc à la fin du nœud n'était pas une option, et j'ai trouvé un autre moyen qui semble résoudre le problème.

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

Voici l'exemple de code:

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

Il semble que le nœud soit redessiné après avoir changé le texte, ce qui est exactement ce que je voulais en premier lieu.

60
BlunT

Utilisez simplement treeView.BeginUpdate () avant de mettre en gras le nœud, puis treeView.EndUpdate () après avoir mis en gras le nœud.

7
YoungStacker

Il s'agit d'un bogue Windows connu. La solution simple consiste simplement à ajouter un caractère d'espace supplémentaire à la fin de vos chaînes. Le caractère espace ne sera pas visible, mais cela augmentera le nombre de pixels nécessaires pour dessiner la chaîne, de sorte que la chaîne entière sera visible.

5
Adel Hazzah

Je suis d'accord avec la solution proposée. Je veux juste ajouter quelque chose pour éclairer un peu plus le problème. L'arborescence a sa propre police qui détermine la largeur des éléments au niveau racine. Cela compense le fait qu'il n'y a qu'une propriété de hauteur d'élément disponible et aucune propriété de largeur d'élément.

La solution à votre problème consiste à déterminer la police de votre nœud racine, puis à définir l'arborescence sur cette même police. Vous pouvez également le faire au moment de la conception.

J'espère que cela aide quelqu'un.

3
user3161309

Tout cela ne m'aide pas. Qu'est-ce DID l'astuce rend la police un peu plus grande et audacieuse au moment de la conception. (Dans la fenêtre Propriétés)

Assurez-vous donc de définir l'arborescence avec une police suffisamment grande, puis plus tard, vous pouvez ajouter des nœuds avec une police plus petite. Ils conviendront.

3
Bappie

Une solution de contournement pour ce problème est la suivante:

Définissez la police par défaut de treeview en gras dans les propriétés.

Et changez en pas gras quand vous en avez besoin.

2
Ismael

Je fais ce qui suit, je mets l'événement DrawNode à appeler, il met le nœud en gras et supprime la couleur en surbrillance.

Vous pouvez définir la couleur de votre choix à l'aide du premier paramètre de la fonction 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);
}

Maintenant, lorsque je sélectionne un nœud, j'obtiens 20 pixels d'espace supplémentaire, pour ma police, cela fonctionne bien, on peut calculer la "vraie" taille nécessaire mais il n'y a aucune spécification indiquant qu'il doit le faire mais vous pouvez utiliser Graphics.MeasureString si vous sentez que vous devez le faire.

1
PPann

C'est dans vb.Net mais la solution pour ressaisir la valeur du champ TEXTE contourne bien cela. Un péché:

 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
planetblu

Je me rends compte que c'est un vieux fil et qu'il a peut-être été répondu. Je viens de rencontrer ce problème en apprenant à utiliser TreeViews. Ce qui a fonctionné pour moi, c'é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 souhaitez mettre en gras. La taille de police par défaut est 8. quelque chose. J'ai changé le mien en 10, qui était la taille que je voulais pour mes nœuds, et la troncature avait disparu.

0
user5868650

Très facile et fonctionne très 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
Kilus

Ce qui a fonctionné pour moi: se connecter à l'événement de charge dans le constructeur du contrôle et peaufiner le nœud 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
sean.net

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

Ça marche pour moi

0
Romi Ardiansya