在 C# 中,我需要至少能够在单个 RichTextBox 中给人以 2 列的印象。出于我的目的,它可能看起来像这样:
1+1 2
70*8+5 565
1000000-300000 700000
76-10 66
对于左栏中的每个“问题”,都会有相应的答案。
“显而易见”的解决方案是使用这样的标签:
SelectionTabs = new int[] { 0, 500 };
(或者简单地将原始 Rtf 中的\deftab 设置为大约 3000)。
一切都很好,直到左列输入 ITSELF 包含制表符。在这种情况下,一切都会变成梨形。我不介意插入多个制表位,但是当输入包含有时会“超过”特定制表位的文本时,这将无法正常工作。检测到这一点并对其进行适当的解释不仅很难做到,而且由于打印时出现的“几乎但不完全是所见即所得”的结果以及标签受到的影响,也充满了危险。
另一个想法是有一个全局制表符大小(在 Rtf 中使用\deftab),然后计算应该在左列中的每一行之后自动插入多少个制表符(基于左列中最长的行)。这种方法的问题在于,虽然屏幕上的内容看起来不错,但在打印时,右栏会出现一些故障。所谓“故障”,我的意思是每 20 行中大约有 1 行会有“丢失”或“额外”选项卡。这是因为打印并不完全是所见即所得,即使在我遵循本教程之后也是如此:http://msdn.microsoft.com/en-us/library/ms996492.aspx
可以这么说,与 RichTextBox 在屏幕上的 View 相比,即使是打印中的几个像素/点偏移也会对选项卡的定位产生巨大影响。
我也尝试过在 Rtf 中的一行中途更改制表位位置,但不幸的是,尽管它在 Rtf 中的位置如此,但从行的开头应用了这样的控制代码。
我也一直在梳理来自 http://www.biblioscape.com/rtf15_spec.htm 的 Rtf 规范,而且我似乎无能为力。 C# 的 RichTextBoxes 似乎不太适合处理表格(这是另一种可能的解决方案)。还有 Rtf 列,但即使支持它们,它们也可能无济于事,因为第一列一旦被填满就会切换到同一张纸上的第二列(而不是保持第一列和去纸的第二页,这是我想要的)。
我已经花了很多时间解决这个问题,但我完全不知所措。如此简单的事情实际上很难做好。除非我遗漏了一些明显的东西......
---------------- 编辑 1: 这需要使用非固定宽度的字体,所以我不能只用空格填充。
最佳答案
诀窍很简单:我最近做了同样的事情(好吧,差不多)——我必须创建一个文本文件 这给人的印象是它有多个列(在文本文件中?sheesh)
有什么技巧?填充!
假设您拥有之前声明的值
1+1 2
70*8+5 565
1000000-300000 700000
76-10 66
现在,您需要做的就是设置左列的宽度(以字符为单位),以及宽度右栏。假设两个宽度都是 30 个字符。
您现在所要做的就是按照以下伪代码构造一行:
BEGIN-BUILD-TEXT
FOR EACH PAIR X, Y
STRING S1 = X.PADRIGHT(30);
STRING S2 = Y.PADRIGHT(30);
WRITE_LINE_TO_TEXTBOX(S1 + S2);
这样,列将左对齐并具有固定宽度。
对我有用!
编辑:您的 RichTextBox
应该使用固定宽度的字体(它对所有字符具有相同的宽度)。
关于c# - Winforms RichTextBox 中的两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8804958/