在 WinForms DataGrid 中为特殊字符(而不是空格)换行

Posted

技术标签:

【中文标题】在 WinForms DataGrid 中为特殊字符(而不是空格)换行【英文标题】:Break line in WinForms DataGrid for special characters (instead of white spaces) 【发布时间】:2020-11-18 18:30:06 【问题描述】:

我有一个 WinForms 数据网格。一列从用户那里获取公式(如“1+55-var+4”)。此列的内容可能很长,因此我在该列中启用了文本换行。

myGridView.Columns(5).DefaultCellStyle.WrapMode = DataGridViewTriState.True
myGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
myGridView.Columns(5).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill

这种行为非常适用于常见的文本列,因为换行可以识别空格以进行换行。 但是我的公式内容没有空格。我希望在特殊字符(即 +、-、/、*)或列空间重叠时发生换行。

有人知道吗?谢谢。

【问题讨论】:

解决方法可能是:您可以在设置单元格值之前用特殊字符 + vbCrLf 替换特殊字符(例如:cellValue = cellValue.Replace(",", "," & vbCrLf)) 您可能需要使用自定义单元格类型创建自定义列类型并自己绘制文本。 【参考方案1】:

假设您在编辑文本框时不需要换行,最直接的解决方案是在每次 TextBox 失去焦点或调整大小时自行添加和删除返回字符。 (就像 G3nt_M3caj 说的那样)但是,根据字体确定确切的时间和位置返回可能会变得混乱。

或者,每次 TextBox 失去焦点时,查找文本中的所有特殊字符,并使用零宽度空间 (U+200B) 附加和前置字符。每次文本框获得焦点时,都会找到并删除所有零宽度空间。然后,您甚至不必担心 TextBox 的大小调整。

如果您制作数字按钮计算器,您还需要在每个特殊字符之前和之后添加零宽度空间,如下所示:

private void ButtonClick(object sender, EventArgs e)
   string key = ((Button)sender).Text; //A string containing the character that has been clicked.
    if ( '0' <= key[0] && key[0] <= '9' ) textBox1.AppendText(key);
    else textBox1.AppendText('\u200B'+ key + '\u200B');

最后一点,无论您做什么,都要确保不能复制具有零宽度空格的文本。调试以某种方式包含零宽度字符的代码将是一场噩梦。

编辑:我刚刚意识到您从未说过您在 DataGrid 中使用了 TextBox。好吧,我认为无论哪种方式都可以。

【讨论】:

以上是关于在 WinForms DataGrid 中为特殊字符(而不是空格)换行的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 winforms 应用程序中设置我的 datagrid 滚动条的位置?

.NET Winforms DataGrid 中的编程数据

wpf datagrid 有没有像 winforms DataGridView 这样的虚拟模式?

如何把WinForms中DataGrid的第一列放上复选框,可以多项选择???急!

在 WinForms 中为上下文菜单动态选择菜单项的正确方法是啥?

在设计器中为 winforms 应用程序打开的表单的运行上下文是啥