我正在尝试创建一个聊天机器人。我会很诚实,UI不是我的强项。我正在逻辑部分的聊天机器人的后端工作,但是为了测试我需要一个适当的工作UI。所以,我选择更容易使用winforms。我创建了一个单列DataGridView,并且在聊天窗口底部的文本框中写的所有文本都将显示为DataGridView行。 winform锚定在各个方向生长。因此,当我加载exe时,它显示为一个微型窗口,当我最大化它时,DataGridView部分和文本框会相应增长。
当我输入一个长字符串且winform未处于最大化状态时,文本不会包含在可见区域的行中。它水平延伸,因此在屏幕上显然不可见。当我最大化窗口时,我可以看到文本。当我给出一个非常长的字符串并最大化窗口时,只有那么多字符串显示在行中,因为它可以适合屏幕大小。
我想要做什么:我希望文本自动换行,这样无论我的窗口是最大化还是最小化,我都能看到窗口中的整个字符串都是包装好的格式。
我尝试过:
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
答案 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);
}
}