2009-05-26 27 views
5

Tengo un DataGridView en modo de solo lectura en una aplicación .NET 3.5 (Visual Studio 2008) WinForms.Cómo deshabilitar los puntos suspensivos de los textos de celda en WindowsForms DataGridView?

El ancho de las celdas es muy pequeño. Algunas de las celdas contienen un número corto. Ahora, incluso con una fuente pequeña, a veces el número se muestra con puntos suspensivos. Por ejemplo "8 ..." en lugar de "88".

¿Hay alguna manera de dejar que el texto fluya sobre la celda siguiente en un DataGridView estándar y evitar las elipsis?

Gracias!

Respuesta

2

Encontré que la solución dada aquí por KD2ND es insatisfactoria. Parece una tontería reintroducir por completo la pintura de células para un cambio tan pequeño: es demasiado trabajo manejar la pintura de los encabezados de las columnas & filas seleccionadas también. Por suerte hay una solución más limpia:

// you can also handle the CellPainting event for the grid rather than 
// creating a grid subclass as I have done here. 
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) 
{ 
    var isSelected = e.State.HasFlag(DataGridViewElementStates.Selected); 

    e.Paint(e.ClipBounds, DataGridViewPaintParts.Background 
     //| DataGridViewPaintParts.Border 
     //| DataGridViewPaintParts.ContentBackground 
     //| DataGridViewPaintParts.ContentForeground 
     | DataGridViewPaintParts.ErrorIcon 
     | DataGridViewPaintParts.Focus 
     | DataGridViewPaintParts.SelectionBackground); 

    using (Brush foreBrush = new SolidBrush(e.CellStyle.ForeColor), 
     selectedForeBrush = new SolidBrush(e.CellStyle.SelectionForeColor)) 
    { 
     if (e.Value != null) 
     { 
      StringFormat strFormat = new StringFormat(); 
      strFormat.Trimming = StringTrimming.Character; 
      var brush = isSelected ? selectedForeBrush : foreBrush; 

      var fs = e.Graphics.MeasureString((string)e.Value, e.CellStyle.Font); 
      var topPos= e.CellBounds.Top + ((e.CellBounds.Height - fs.Height)/2); 

      // I found that the cell text is drawn in the wrong position 
      // for the first cell in the column header row, hence the 4px 
      // adjustment 
      var leftPos= e.CellBounds.X; 
      if (e.RowIndex == -1 && e.ColumnIndex == 0) leftPos+= 4; 

      e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, 
       brush, leftPos, topPos, strFormat); 
     } 
    } 

    e.Paint(e.ClipBounds, DataGridViewPaintParts.Border); 
    e.Handled = true; 
} 

El truco es dejar que el método de pintura existente `manejar la pintura de la mayor parte de la célula. Solo nos ocupamos de pintar el texto. El borde está pintado después del texto porque descubrí que, de lo contrario, el texto a veces se pintaba sobre el borde, lo que se ve mal.

1

No, probablemente haya alguna propiedad para desactivar las elipsis (si tiene acceso a los controles subyacentes), pero el flujo (y también la combinación de celdas) no es compatible con DataGridView estándar.

3

controlan el evento CellPainting del control DataGridView. Compruebe el siguiente enlace:

http://msdn.microsoft.com/en-us/library/hta8z9sz.aspx

Tenga en cuenta que cuando se dibuja el texto en sí necesita personalizar el StringFormat -

cita del código de MSDN:

if (e.Value != null) 
{ 
    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, 
        Brushes.Crimson, e.CellBounds.X + 2, 
        e.CellBounds.Y + 2, StringFormat.GenericDefault); 
} 

Usar la siguiente Objeto StringFormat en lugar de StringFormat.GenericDefault:

StringFormat strFormat = new StringFormat(); 
strFormat.Trimming = StringTrimming.None; 

Saludos

0

Una técnica simple que podría funcionar para usted es sólo para encender WrapMode de la celda en cuestión

1

En cambio Diseñador DataGridView propiedad "RowDefaultCellStyle" -> ajuste "Modo Wrap" = "true"

Cuestiones relacionadas