如何解决确保文本在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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。