web-dev-qa-db-fra.com

Assurer le retour à la ligne dans une colonne dataGridView

J'ai DataGridView avec une colonne particulière. Lorsque j'écris un texte long dans dataGridView, il me montre une version abrégée, avec des ellipses, car la colonne n'est pas assez large pour afficher la chaîne entière.

| textdsadasda...  |

Que dois-je faire si je veux que dataGridView affiche ce texte sur la ligne suivante ou l'enveloppe?

| textdsadasda     |
| dasdasa          |  (continuation of line above)

Comment cela peut-il être fait?

15
nirmus

Peut-être gérer l'événement de peinture cellulaire peut vous aider

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.Value == null)
        return;
    var s = e.Graphics.MeasureString(e.Value.ToString(), dataGridView1.Font);
    if (s.Width > dataGridView1.Columns[e.ColumnIndex].Width)
    {
        using (
  Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
  backColorBrush = new SolidBrush(e.CellStyle.BackColor))
        {
            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
            e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, Brushes.Black, e.CellBounds,StringFormat.GenericDefault);
            dataGridView1.Rows[e.RowIndex].Height = (int)(s.Height * Math.Ceiling( s.Width / dataGridView1.Columns[e.ColumnIndex].Width)) ;
            e.Handled = true;
        }
    }
}
1
DeveloperX

Essayez de mettre

  • .AutoSizeMode à .DisplayedCells.
  • Définissez AutoSizeRowsMode sur AllCells.
  • DataGridView.DefaultCellStyle.WrapMode à DataGridViewTriState.True
17
sgokhales

Il n'est pas nécessaire de réinventer la roue en repeignant la cellule.

Au lieu de cela simplement:

  • Définissez la propriété AutoSizeRowsMode sur AllCells. Cela permet à la hauteur de ligne de croître avec tout texte enveloppé.
  • Définissez DataGridView.DefaultCellStyle.WrapMode sur DataGridViewTriState.True pour insérer du texte dans les cellules.
  • Plus important encore, définissez DataGridView.AutoSizeColumnsMode sur DataGridViewAutoSizeColumnsMode.None afin que les colonnes ne se rediment pas elles-mêmes (afin qu'elles restent à la largeur spécifiée par l'utilisateur).

Après cela, le texte devrait passer à la ligne suivante s'il n'y a pas assez d'espace dans la colonne.

13
Adam

Vous pouvez essayer de régler le DataGridView.DefaultCellStyle.WrapMode sur DataGridViewTriState.True

4
Bala R

J'ai trouvé @DeveloperX answer vraiment utile, mais avec quelques ratés:

  1. Certaines lignes scintillent s'il y a plus d'une cellule à emballer.
  2. Certaines cellules ont la dernière ligne manquante ou tronquée (cela se produit s'il y a des mots longs qui ne peuvent pas être placés dans le texte)

Et cela a également causé des bordures de cellules manquantes (mais cela dépend des paramètres de bordure de grille/cellule).

J'ai refait le code de @DeveloperX pour résoudre ce problème et je suis parvenu au code suivant:

private int _rowMaxHeight = 0;
private int _rowDefaultHeight = 0;
private void dataGridView1_CellPainting(object sender, 
    DataGridViewCellPaintingEventArgs e)
{
    if (e.Value == null || e.RowIndex < 0)
    {
        // The WordWrap code is ony executed if requested the cell has a value,
        // and if this is not the heading row.
        return;
    }
    if (e.ColumnIndex == 0)
    {
        // Resetting row max height on each row's first cell
        _rowMaxHeight = 0;
        if (_rowDefaultHeight == 0)
        {
            /* The default DataGridView row height is saved when the first cell
             * inside the first row is populated the first time. This is later
             * used as the minimum row height, to avoid 
             * smaller-than-default rows. */
            _rowDefaultHeight = dataGridView1.Rows[e.RowIndex].Height;
        }
    }
    // Word wrap code
    var sOriginal = e.Graphics.MeasureString(e.Value.ToString(), 
        dataGridView1.Font);
    var sWrapped = e.Graphics.MeasureString(e.Value.ToString(), 
        dataGridView1.Font,
        // Is is MeasureString that determines the height given the width, so
        // that it properly takes the actual wrapping into account
        dataGridView1.Columns[e.ColumnIndex].Width);    
    if (sOriginal.Width != dataGridView1.Columns[e.ColumnIndex].Width)
    {
        using (Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor), 
            backColorBrush = new SolidBrush(e.CellStyle.BackColor), 
            fontBrush = new SolidBrush(e.CellStyle.ForeColor))
        {
            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
            // The DrawLine calls restore the missing borders: which borders
            // miss and how to Paint them depends on border style settings
            e.Graphics.DrawLine(new Pen(gridBrush, 1),
                new Point(e.CellBounds.X - 1, 
                    e.CellBounds.Y + e.CellBounds.Height - 1),
                new Point(e.CellBounds.X + e.CellBounds.Width - 1, 
                    e.CellBounds.Y + e.CellBounds.Height - 1));
            e.Graphics.DrawLine(new Pen(gridBrush, 1),
                new Point(e.CellBounds.X + e.CellBounds.Width - 1, 
                    e.CellBounds.Y - 1),
                new Point(e.CellBounds.X + e.CellBounds.Width - 1, 
                    e.CellBounds.Y + e.CellBounds.Height - 1));
            //Updating the maximum cell height for wrapped text inside the row:
            // it will later be set to the row height to avoid the flickering
            // that would occur by setting the height multiple times.
            _rowMaxHeight = (Math.Ceiling(sWrapped.Height) > _rowMaxHeight)
                ? (int)Math.Ceiling(sWrapped.Height) : _rowMaxHeight;
            // The text is generated inside the row.
            e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, 
                fontBrush, e.CellBounds, StringFormat.GenericDefault);
            e.Handled = true;
        }
    }
    if (e.ColumnIndex == dataGridView1.ColumnCount -1 
        && _rowMaxHeight > 0 
        && _rowMaxHeight != dataGridView1.Rows[e.RowIndex].Height)
    {
        // Setting the height only in the last cell, when the full row has been
        // painted, helps to avoid flickering when more than one row 
        // needs the wrap.
        dataGridView1.Rows[e.RowIndex].Height = 
            (_rowMaxHeight > _rowDefaultHeight) 
            ? _rowMaxHeight : _rowDefaultHeight;
    }
}

Notez qu'il reste un problème non résolu avec ce code: le texte n'est plus centré verticalement à l'intérieur des cellules!

3
Fulvio

Le réglage de cette valeur vous aide-t-il à obtenir l’affichage souhaité?

dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;

en plus de régler le WrapMode = DataGridViewTriState.True;

2
V4Vendetta