0

我正在尝试实现一个单元格宽度小于 autosize 的 DataGridView。如果您仔细查看自动调整大小的单元格,您会注意到仍有一些空间未用于实际显示单元格的内容。

这就是为什么我开始自己测量内容的宽度TextRenderer,然后手动设置列的宽度。

最初的问题是“A”在单元格实际“填充”之前很久就显示为“A...”。原因被cell.Style.WrapMode设置为“nonSet”。我很高兴这DataGridViewTriState.True确实适用于那个“A”示例。

但现在我刚刚注意到,如果字符串有多个单词(“A,B”),DataGridView 会在单元格实际“填充”之前很久尝试将内容显示到几行。

我现在正在寻找的要么是删除单元格内容的“填充”,要么是完全抑制某个单元格/列上的自动换行(= 没有截断字符串的单行)。

此外,我应该承认该字符串上没有隐藏的空白,因此修剪根本没有效果。

编辑: 我偶然发现了一些同事的代码,这些代码似乎与我正在搜索的内容相似。

StringFormat format = new StringFormat(StringFormatFlags.NoClip);

文档说字符串周围有一些比字符串本身大的矩形。如果矩形伸出可写区域,则字符串被换行。该代码片段抑制了该(默认)行为。

唯一的问题是这个解决方案似乎只适用于绘制字符串。我没有找到将 stringformat 对象分配给字符串的可能性。

4

2 回答 2

0

试试这个代码

dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;

dataGridView1.DefaultCellStyle.WrapMode to DataGridView1TriState.True

希望对你有帮助

于 2013-05-08T07:52:21.220 回答
0

你能试试这个代码。这在我的情况下有效。

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;
        }
    }
}
于 2013-05-08T08:07:27.497 回答