以编程方式调整DataGridView上的行宽以防止省略号

时间:2017-11-26 18:39:35

标签: c# winforms datagridview

我有一个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 += "-----";它可以正常工作,但由于这只是一个任意数量的字符,因此无法判断它是否会一直有效。所以我想知道我在这里缺少什么东西,我应该添加到我的宽度。

0 个答案:

没有答案