Pregunta ¿Cómo deshabilitar los puntos suspensivos de los textos de celda en un DataFridView de WindowsForms?


Tengo un DataGridView en modo de solo lectura en una aplicación WinForms de .NET 3.5 (Visual Studio 2008).

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 una manera de permitir que el texto fluya sobre la siguiente celda en un DataGridView estándar y evitar los puntos suspensivos?

¡Gracias!


5
2018-05-26 11:30


origen


Respuestas:


Encontré que la solución dada aquí por KD2ND es insatisfactoria. Parece tonto reimplementar completamente la pintura de celdas para un cambio tan pequeño; es mucho trabajo manejar la pintura de encabezados de columnas y filas seleccionadas también. Afortunadamente hay una solución más ordenada:

// 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 consiste en dejar que el método `Paint existente maneje la pintura de la mayor parte de la celda. Solo nos ocupamos de pintar el texto. El borde se pinta después del texto porque descubrí que, de lo contrario, el texto a veces se pintaría sobre el borde, lo que se ve mal.


2
2018-04-14 17:03



manejar el evento CellPainting del control DataGridView. Revisa el siguiente enlace:

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

Tenga en cuenta que cuando dibuja el texto en sí mismo, 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);
}

Use el siguiente objeto StringFormat en lugar de StringFormat.GenericDefault:

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

Saludos


3
2018-05-12 11:03



En el Diseñador, cambie la propiedad DataGridView "RowDefaultCellStyle" -> configure "Wrap Mode" = "true"


2
2017-10-23 23:36



No, es probable que haya alguna propiedad para deshabilitar los puntos suspensivos (si accede a los controles subyacentes), pero el flujo sobre (y también la fusión de celdas) no se admite en el DataGridView estándar.


1
2018-05-26 11:50



Una técnica simple que podría funcionar para usted es simplemente activar WrapMode para la celda en cuestión


0
2018-01-06 08:02