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?
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;
}
}
}
Essayez le réglage
.AutoSizeMode
.DisplayedCells
.- mettez le
AutoSizeRowsMode
AllCells
. DataGridView.DefaultCellStyle.WrapMode
DataGridViewTriState.True
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
pourDataGridViewAutoSizeColumnsMode.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.
vous pouvez essayer de définir le DataGridView.DefaultCellStyle.WrapMode
DataGridViewTriState.True
j'ai trouvé @DeveloperX réponse vraiment utile, mais avec un couple de hoquet:
- il provoque quelques lignes à clignoter, s'il y a plus d'une cellule qui a besoin d'emballage
- 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!
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;
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;