2010-02-16 8 views
51

estoy usando el siguiente código para hacer mis TreeNodes negrita:C# WinForms nodo negrita vista de árbol no aparece en el documento entero

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

Pero no se visualiza el texto de los nodos en negrilla correctamente. La (s) última (s) carta (s) no se muestran. ¿Cómo? ¿Y cómo resolver este problema?

Respuesta

15

He encontrado que esto es un problema de Windows. Una solución para este problema es esto:

En el constructor de formulario, establezca la fuente de la vista en árbol en negrita. Al agregar nodos que no deben estar en negrita, cambie la fuente a regular:

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

tener en cuenta que '' Font' implementa IDisposable' por lo que siempre debe tener su método 'Dispose' llama cuando ya no es necesario. por esta razón, probablemente deberías crear tu 'Fuente' como un campo y asegurarte de que llamas su método' Dispose' en el método 'Dispose' del' Form' –

+0

@AdamRalph, el método Dispose de 'font' no se obtendría automáticamente llamado para salir del Contructor o estoy malentendido algo? – Crisfole

+3

Creo que en el ejemplo anterior la fuente se almacena como una propiedad de la vista en árbol, la vista en árbol se eliminará mediante el formulario, la vista en árbol eliminará la fuente sucesivamente. Supongo que este es el caso porque el diseñador de formularios asigna nuevas fuentes a los controles y no los descarta. – DarrenMB

5

Se trata de un error conocido de Windows. La solución simple es simplemente agregar un carácter de espacio adicional al final de sus cadenas. El carácter de espacio no será visible, pero aumentará el número de píxeles necesarios para dibujar la cadena, por lo que toda la cadena será visible.

55

Encontré esta publicación cuando busqué en la web porque estoy enfrentando exactamente el mismo problema.

Sin embargo, agregar un espacio en blanco al final del nodo no era una opción, y encontré una manera alternativa que parece solucionar el problema.

Después de configurar la fuente de mi nodo Negrita, todo lo que tengo que hacer es restablecer el texto del nodo con el mismo valor.

Aquí está el código de muestra:

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

Parece que el nodo se vuelve a dibujar después de cambiar el texto, que es exactamente lo que quería en primer lugar.

+7

Este es el mejor trabajo que he visto hasta ahora. BlunT ha resuelto un problema crónico. – Osiris

+13

Tuve que configurar la fuente, agregar el nodo al árbol Y ENTONCES reiniciar el texto para que funcione. Si configuro la fuente y restablezco el texto antes de agregarlo al árbol, el texto aún se trunca. –

+0

Esta es una solución ligeramente mejor que la respuesta existente porque corrige el problema de tamaño en lugar de simplemente sobredimensionar el área de representación de los nodos con una fuente más ancha. También es fácil de implementar si ya usa y hereda treenode y puede simplemente sombrear la propiedad para volver a aplicar el texto si la fuente está en negrita. Esto solucionó un problema muy frustrante con el que he estado luchando durante mucho tiempo, gracias. – DarrenMB

0

muy fácil y funciona 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; 
+2

La comunidad de SO prefiere una explicación sobre por qué y cómo se está resolviendo un problema de esa manera. Por lo tanto, si pudiera explicar por qué lo hace, su publicación sería mucho más valiosa. – ForceMagic

3

Todo esto no está ayudando para mí. Lo que hizo el truco es hacer que la fuente sea un poco más grande y audaz en el momento del diseño. (En la ventana Propiedades)

Así que asegúrese de definir la vista de árbol con una fuente lo suficientemente grande, luego puede agregar nodos con una fuente más pequeña. Ellos encajarán.

3

Estoy de acuerdo con la solución provista. Solo quiero agregar algo para arrojar un poco más de luz sobre cuál es el problema. La vista en árbol tiene su propia fuente que determina el ancho de los elementos en el nivel raíz. Eso compensa el hecho de que solo hay una propiedad de altura de artículo disponible y ninguna propiedad de ancho de artículo.

La solución a su problema es determinar cuál debe ser la fuente de su nodo raíz, luego configure el árbol para esa misma fuente. Usted puede hacer eso en tiempo de diseño también.

Espero que ayude a alguien.

1

Una solución para este problema es el siguiente:

Configuración de la fuente defaul de vista de árbol en negrita en las propiedades.

Y no está en negrita cuando lo necesita.

0

Me doy cuenta de que este es un hilo viejo y puede haber sido respondido. Acabo de encontrarme con este problema cuando estoy aprendiendo a usar TreeViews. Lo que funcionó para mí fue cambiar el tamaño de la fuente para todo el TreeView al mismo tamaño, o más grande que la fuente del nivel que desea en negrita. El tamaño de fuente predeterminado es 8. algo. Cambié el mío a 10, que era del tamaño que quería mis nodos, y el truncado desapareció.

0

Lo que funcionó para mí: Enganchar en el evento de carga en el constructor del Control y ajustar el nodo como se explica en la respuesta 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

Está en vb.Net sin embargo, la solución para volver a entrar en el valor del campo de texto evita esto muy bien. Como en:

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 
3

Utilice simplemente treeView.BeginUpdate() antes de negrita a continuación, el nodo treeView.EndUpdate() después de haber aparecerá en negrita nodo.

0

Hago lo siguiente, configuro el evento DrawNode para llamar, establece el nodo en negrita y elimina el color resaltado.

Puede establecer cualquier color que desee utilizando el primer parámetro de la función 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); 
} 

Ahora cuando selecciono un nodo me sale 20 píxeles más espacio, para mi fuente, esto funciona bien, se puede calcular el tamaño "real" es necesario, pero no hay ninguna especificación que indique que tiene que hacer esto, pero usted puede usar Graphics.MeasureString si siente que necesita hacer eso.

1

Basado en MSDN Library, intente cambiar el código para:

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

que funcione para mí

+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada a corto plazo. Una explicación adecuada [mejoraría en gran medida] (https: //meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) su valor a largo plazo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que hizo –

+0

@ShawnC. Gracias por tu sugerencia –

Cuestiones relacionadas