在DataGridView

时间:2016-09-23 12:31:52

标签: c# .net winforms datagridview

我正在尝试创建一个聊天机器人。我会很诚实,UI不是我的强项。我正在逻辑部分的聊天机器人的后端工作,但是为了测试我需要一个适当的工作UI。所以,我选择更容易使用winforms。我创建了一个单列DataGridView,并且在聊天窗口底部的文本框中写的所有文本都将显示为DataGridView行。 winform锚定在各个方向生长。因此,当我加载exe时,它显示为一个微型窗口,当我最大化它时,DataGridView部分和文本框会相应增长。

当我输入一个长字符串且winform未处于最大化状态时,文本不会包含在可见区域的行中。它水平延伸,因此在屏幕上显然不可见。当我最大化窗口时,我可以看到文本。当我给出一个非常长的字符串并最大化窗口时,只有那么多字符串显示在行中,因为它可以适合屏幕大小。

我想要做什么:我希望文本自动换行,这样无论我的窗口是最大化还是最小化,我都能看到窗口中的整个字符串都是包装好的格式。

我尝试过:

dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

1 个答案:

答案 0 :(得分:3)

DataGridViewTextBox使用分词执行换行。这意味着如果你有一个长文本,那么中断将仅适用于单词的结尾。根据您的要求,在换行时需要进行字符分解。为此,您需要创建一个自定义单元格并以这种方式执行字符分隔包装:

  • 覆盖GetPreferredSize方法,根据字符中断自动换行计算单元格/行的高度。为此,您可以使用Graphics.MeasureString方法。

  • 使用Paint方法覆盖Graphics.DrawString方法以使用字符分隔绘制包装字符串。

您可以执行以下设置:

  • 要为列使用DataGridView的宽度,您应将AutoSizeMode设置为Fill。这样,您的列宽将填充网格,并将根据网格大小更改其大小。此外,如果您有多个列,则可以设置FillWeight来控制列大小相对于其他列的百分比。

  • 要将文字换行,您应该将列的DefaultCellStyle.WrapMode设置为DataGridViewTriState.True

  • 要使行自动调整大小,您应将AutoSizeRowMode的{​​{1}}设置为DataGridView

  • 将我们创建的自定义单元格注册为列的DataGridViewAutoSizeRowsMode.AllCells

<强> MyDataGridViewTextBoxCell

此单元格使用字符分隔而不是分词来执行文本换行。

CellTemplate

示例

public class MyDataGridViewTextBoxCell:DataGridViewTextBoxCell
{
    protected override Size GetPreferredSize(Graphics graphics, 
        DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
    {
        if(cellStyle.WrapMode== DataGridViewTriState.True && this.RowIndex>=0)
        {
            var value= string.Format("{0}", this.FormattedValue);
            using (var g = this.OwningColumn.DataGridView.CreateGraphics())
            {
                var r =  g.MeasureString(value, cellStyle.Font, this.OwningColumn.Width )
                          .ToSize();
                r.Width += cellStyle.Padding.Left + cellStyle.Padding.Right;
                r.Height += cellStyle.Padding.Top + cellStyle.Padding.Bottom;
                return r;
            }
        }
        else
        {
            return base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize);
        }
    }
    protected override void Paint(Graphics graphics, Rectangle clipBounds, 
        Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
        object value, object formattedValue, string errorText, 
        DataGridViewCellStyle cellStyle, 
        DataGridViewAdvancedBorderStyle advancedBorderStyle, 
        DataGridViewPaintParts paintParts)
    {
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
            formattedValue, errorText, cellStyle, advancedBorderStyle, 
            paintParts & ~ DataGridViewPaintParts.ContentForeground);
        graphics.DrawString(string.Format("{0}", formattedValue), 
            cellStyle.Font, Brushes.Black, cellBounds);
    }
}