CodeGo.net>在DataGridView中换行

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

当我键入一个长字符串并且winform不在最大化状态时,文本不会被包裹在可见区域的行中.它水平延伸,因此在屏幕上显然不可见.当我最大化窗口时,可以看到文本.当我给出一个非常长的字符串并最大化窗口时,该行中仅显示了大部分字符串,因为它可以适合屏幕尺寸.

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

我试过的

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

解决方法:

DataGridViewTextBox使用断字执行换行.这意味着,如果您的文字较长,则换行符仅适用于字词结尾.根据您的要求,换行时需要换字符.为此,您需要创建一个自定义单元格并通过以下方式执行换行符换行:

>覆盖GetPreferredSize方法,以基于换行符换行来计算单元格/行的高度.为此,可以使用Graphics.MeasureString方法.
>重写Paint方法,使用Graphics.DrawString方法以换行符绘制带换行符的字符串.

您可以执行以下设置:

>要为列使用DataGridView的宽度,应将其AutoSizeMode设置为Fill.这样,您的列宽将填充网格,并将根据网格大小更改其大小.同样,如果您有多于一列,则可以设置FillWeight来控制相对于其他列的列大小百分比.
>要将文本包装在列中,应将列的DefaultCellStyle.WrapMode设置为DataGridViewTriState.True.
>要使行自动调整大小,应将DataGridView的AutoSizeRowMode设置为DataGridViewAutoSizeRowsMo​​de.AllCells.
>将我们创建的自定义单元格注册为该列的CellTemplate.

MyDataGridViewTextBoxCell

此单元格使用换行符而不是单词换行符来执行文本换行.

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);
    }
}

public class Model
{
    public string Text { get; set; }
}

BindingList<Model> list = new BindingList<Model>();

private void Form1_Load(object sender, EventArgs e)
{
    var column1 = new DataGridViewTextBoxColumn();
    column1.CellTemplate = new MyDataGridViewTextBoxCell();
    column1.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    column1.DataPropertyName = "Text";
    column1.DefaultCellStyle = new DataGridViewCellStyle();
    column1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
    column1.HeaderText = "Text";
    column1.Name = "column1";

    dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
    dataGridView1.Columns.Add(column1);

    this.dataGridView1.DataSource = list;
}

private void button1_Click(object sender, EventArgs e)
{
    list.Add(new Model() { Text = textBox1.Text });
}
上一篇:c# – 从DataGrid读取而不是从csv文件读取到数组/列表


下一篇:如何动态地在C#windows应用程序中的DataGridView单元格中添加表?