我试图实现一个DataGridView,具有比autosize更小的单元格宽度。如果你仔细观察一个自动调整大小的单元格,你会发现仍然有一些空间不是用来显示单元格的内容的。
这就是为什么我开始通过TextRenderer
自己测量内容的宽度,然后手动设置列的宽度。
最初的问题是,在单元格实际"填充"之前,"a"被显示为"a…"。原因是cell.Style.WrapMode
被设置为"nonSet"。我很高兴DataGridViewTriState.True
确实为"A"的例子工作。
但是现在我注意到,如果字符串有多个单词("A, B"),DataGridView试图在单元格实际"填充"之前将内容显示到几行。
我现在正在寻找的是一种方法来删除单元格内容的"填充"或完全抑制某个单元格/列上的单词包装(=单行没有字符串的切断)。
另外,我应该承认在字符串上没有隐藏的空白,所以trim没有任何作用。
编辑:我偶然发现了一些同事的代码,它们似乎可以做我正在寻找的事情。
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
文档中说字符串周围有一个比字符串本身大的矩形。如果矩形超出可写区域,则字符串被包裹。该代码片段抑制了该(默认)行为。
唯一的问题是,这个解决方案似乎只适用于绘制字符串。我没有发现将stringformat对象赋值给字符串的可能性
试试这个代码
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
dataGridView1.DefaultCellStyle.WrapMode to DataGridView1TriState.True
希望对你有所帮助
可以试试这段代码吗?这在我的情况下是可行的。
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;
}
}
}