S'assurer que le texte est enveloppé dans une colonne de dataGridView

j'ai dataGridView avec une colonne particulière. Quand j'écris un long texte dans dataGridView il me montre une version raccourcie, avec des ellipses, parce que 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 dans la prochaine ligne, ou envelopper le texte?

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

Comment cela peut-il être fait?

15
demandé sur KyleMit 2011-06-13 05:00:19

7 réponses

Peut-être la manipulation de cellules manifestation de peinture 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;
        }
    }
}
2
répondu DeveloperX 2011-06-13 06:38:24

Essayez le réglage

  • .AutoSizeMode.DisplayedCells.
  • mettez le AutoSizeRowsModeAllCells.
  • DataGridView.DefaultCellStyle.WrapModeDataGridViewTriState.True
17
répondu Javascript is GOD 2011-06-13 01:32:36

Il n'est pas nécessaire de réinventer la roue par repeindre la cellule.

au lieu de cela simplement:

  • Set AutoSizeRowsMode propriété AllCells. Cela permet à hauteur de ligne à grandir avec n'importe quel texte enveloppé.
  • Set DataGridView.DefaultCellStyle.WrapMode DataGridViewTriState.True pour placer du texte dans les cellules.
  • le Plus important ensemble DataGridView.AutoSizeColumnsMode pour DataGridViewAutoSizeColumnsMode.None pour que les colonnes ne se redimensionnent pas (de sorte qu'ils restent à l'utilisateur largeur spécifiée).

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

13
répondu Adam 2012-06-28 12:43:36

vous pouvez essayer de définir le DataGridView.DefaultCellStyle.WrapModeDataGridViewTriState.True

4
répondu Bala R 2011-06-13 01:12:54

j'ai trouvé @DeveloperX réponse vraiment utile, mais avec un couple de hoquet:

  1. il provoque quelques lignes à clignoter, s'il y a plus d'une cellule qui a besoin d'emballage
  2. certaines cellules ont la dernière ligne manquante ou tronquée (cela se produit s'il y a de longs mots qui ne peuvent pas être enveloppés dans le texte)

et cela a aussi causé des bordures de cellules manquantes (mais cela dépend des paramètres de bordures de grid/cellules).

j'ai fait une reprise de @DeveloperX code pour résoudre ces problèmes, et est venu avec le 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 y a encore un problème non résolu avec ce code: le texte n'est plus centré verticalement à l'intérieur des cellules!

3
répondu Fulvio 2017-05-23 12:17:19

le fait de définir cette valeur aide - t-il à réaliser l'affichage comme vous le voulez

dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;

en plus de définir l' WrapMode = DataGridViewTriState.True;

2
répondu V4Vendetta 2011-06-13 05:04:56

je suis d'accord avec la réponse qui a été décrit simplement le réglage de l' WordWrap sur la cellule et ajouterait à cela ce scénario.

j'avais besoin de changer les couleurs et les styles de police à la volée en me basant sur les données de chaque cellule. Au départ, je pensais que j'étais coincé à comprendre comment faire le DrawString travail avec du papier d'emballage à l'intérieur de CellPainting événement en raison de besoin de différentes couleurs.

cependant, à la fin je mets juste le Cell.Style propriétés à l'intérieur du CellPainting événement, puis a quitté l'événement sans mettre le e.Handled = true. De cette façon, l'événement de peinture de la grille utilisé les styles que je fixe pour chaque cellule et le texte enveloppé correctement.

Par exemple:

datagrid1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Green;
-1
répondu Clint Carter 2012-10-25 17:15:44