确保文本在dataGridView列中换行

问题描述

| 我有特定列的dataGridView。当我在dataGridView中写长文本时,它显示的是带省略号的缩短版本,因为该列的宽度不足以显示整个字符串。
| textdsadasda...  |
如果要dataGridView在下一行显示此文本或将其换行,该怎么办?
| textdsadasda     |
| dasdasa          |  (continuation of line above)
如何才能做到这一点?     

解决方法

        可能正在处理细胞绘画活动可以帮助您
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;
        }
    }
}
    ,        尝试设定
.AutoSizeMode
.DisplayedCells
。 将
AutoSizeRowsMode
设置为
AllCells
DataGridView.DefaultCellStyle.WrapMode
DataGridViewTriState.True
    ,        无需通过重新喷涂单元来重新发明轮子。 而是简单地: 将
AutoSizeRowsMode
属性设置为
AllCells
。这样行高度可以达到 与任何包装的文字一起成长。 套装
DataGridView.DefaultCellStyle.WrapMode
DataGridViewTriState.True
将文本包装在单元格中。 最重要的是将
DataGridView.AutoSizeColumnsMode
设置为
DataGridViewAutoSizeColumnsMode.None
,以免列自行调整大小 (因此它们将保持用户指定的宽度)。 此后,如果该列中没有足够的空间,则文本应换行到下一行。     ,        您可以尝试将
DataGridView.DefaultCellStyle.WrapMode
设置为
DataGridViewTriState.True
    ,        我发现@DeveloperX答案确实很有用,但是有一些麻烦: 如果存在多个需要包装的单元,则会导致某些行闪烁 某些单元格的最后一行丢失或被截断(如果文本中不能包含长单词,则会发生这种情况) 而且这还会导致丢失单元格边界(但这取决于网格/单元格边界设置)。 我对@DeveloperX代码进行了重做以解决此问题,并提出了以下代码:
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(),// 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,e.CellBounds.Y - 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(),fontBrush,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;
    }
}
请注意,此代码仍然无法解决一个问题:文本在单元格内不再垂直居中!     ,        设置此值是否有助于实现所需的显示
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
除了设置
WrapMode = DataGridViewTriState.True;
    ,        我同意刚才讨论的答案,只需在单元格上设置20英镑,这种情况就会增加。 我需要根据每个单元格中的数据即时更改颜色和字体样式。最初我以为我想弄清楚如何使
DrawString
CellPainting
事件之间的换行有关,因为需要使用不同的文本颜色。 但是,最后我只在
CellPainting
事件中设置了
Cell.Style
属性,然后退出了事件而未设置
e.Handled = true
。这样,网格的绘画事件使用了我为每个单元格设置的样式,并正确包装了文本。 例如:
datagrid1[e.ColumnIndex,e.RowIndex].Style.BackColor = Color.Green;