我有一个DataGridView可以加载大量数据,我希望它可以做一些实际上相当于将特定列AutoSizeMode
设置为AllCells
的内容,但不会造成性能损失。
我想我应该能够通过捕获CellPainting
事件来查看哪些单元格可见,这将触发当前可见的单元格。此外,由于我使用的是等宽字体的“Consolas”字体,并且我知道所有值都是单行的,因此测量任何样本字符串应该足以计算出单元格的正确宽度。
这就是我目前正在做的事情:
private int MaxLength;
private void DataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
// DatabaseLog.Columns.Text is the index of the column I want to adjust the width for
if (e.ColumnIndex == DatabaseLog.Columns.Text && e.FormattedValue is string text && text.Length > MaxLength)
{
text += "-"; // Just to be safe
MaxLength = text.Length;
// And to be extra safe measure it both ways and use the largest one:
var width1 = (int)Math.Ceiling(e.Graphics.MeasureString(text, e.CellStyle.Font).Width); // To be even safer use Ceiling
var width2 = TextRenderer.MeasureText(text, e.CellStyle.Font).Width;
// Use a task in case DataGridView doesn't want to repaint since this is CellPainting
Task.Run(() => BeginInvoke(new Action(() =>
dataGridView.Columns[DatabaseLog.Columns.Text].Width = Math.Max(width1, width2) + e.CellStyle.Padding.Horizontal // Also, add padding
)));
}
}
其中,在超过约100个字符的行上仍会显示省略号。如果我将行text += "-";
更改为text += "-----";
它可以正常工作,但由于这只是一个任意数量的字符,因此无法判断它是否会一直有效。所以我想知道我在这里缺少什么东西,我应该添加到我的宽度。