C# 富文本框中的十进制选项卡

C# 富文本框中的十进制选项卡,c#,richtextbox,rtf,richtext,C#,Richtextbox,Rtf,Richtext,我有一些内容将显示在C#富文本框中。我希望其中一列显示的小数点对齐: // Title Price // Item1 1234.56 // Item2 78.90 // Item3 1.2 下面是在将字符串传递给RichTextBox控件之前(失败)尝试在内存中生成字符串时使用的代码 message = ""; me

我有一些内容将显示在C#富文本框中。我希望其中一列显示的小数点对齐:

//  Title                      Price
//  Item1                     1234.56
//  Item2                       78.90
//  Item3                        1.2
下面是在将字符串传递给RichTextBox控件之前(失败)尝试在内存中生成字符串时使用的代码

message = "";
message += @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033" +
           @"{\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 TEST RICH TEXT BOX \par";
message += @"\pard\sa200\sl276\slmult1\tx4000\ul\b Title\ulnone\b0\tab\ul\b Price\ulnone\b0\line\pard\sa200\sl276\slmult1\tx5000\tqdec\par ";
message += String.Format(@"{0}\tab {1} \line ", "Item1", 1234.56);
message += String.Format(@"{0}\tab {1} \line ", "Item2", 78.90);
message += String.Format(@"{0}\tab {1} \line ", "Item3", 1.2);
message += @"\par}";
使用此选项,结果如下所示:

//  Title                      Price
//  Item1                     1234.56
//  Item2                     78.90
//  Item3                     1.2
我将\tqdec(十进制制表符)命令移动到\tx5000(制表符从左边缘移动5000次)之前,但没有成功。还尝试使用\tqr(tab align right)命令,但未成功


感谢您的建议

哇,我不确定您的真正意图是修改RTF源文本,还是只是为了对齐文本。在下面,我假设您使用的是一个普通字符串,其中制表符转义为\t,新行转义为\r\n。(在正常情况下,您不需要编辑源RTF属性来输入文本…我认为您这样做是有充分理由的…)

这个代码有效吗?你介意尾随的0吗?顺便说一下,制表符不能帮助您对齐文本。必须使用字符串格式选项在需要的位置插入空格

        message += String.Format("{0}\t {1,10:#####0.00} \r\n", "Item1", 1234.56);
        message += String.Format("{0}\t {1,10:#####0.00} \r\n", "Item2", 78.90);
        message += String.Format("{0}\t {1,10:#####0.00} \r\n", "Item3", 1.2);
输出:

Item1     1234.56 
Item2       78.90 
Item3        1.20 

另一种方法是插入一个表(我相信RTF支持表,对吗?),然后在右边用0填充数字,最后像Excel那样右对齐列。

假设WinForms,RichTextBox不支持对齐的选项卡。你可以打开写字板,看到它也没有这些选项

您可能想尝试的一个技巧是使用单元格对齐的表。不幸的是,RichTextBox控件也不支持表(至少在.net 3.5中是这样,我不知道.net 4的情况),但您可以通过以下方式强制它:

public class rtbEx : RichTextBox
{
  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  static extern IntPtr LoadLibrary(string lpFileName);

  protected override CreateParams CreateParams
  {
    get
    {
      var prams = base.CreateParams;
      if (LoadLibrary("msftedit.dll") != IntPtr.Zero)
        prams.ClassName = "RICHEDIT50W";

      return prams;
    }
  }
}
之后,我通常使用MicrosoftWord制作表格,并将其复制/粘贴到richtextbox中,然后相应地调整rtf代码


要想做到这一点还有很长的路要走,但这可能会对您有所帮助。

我的建议是使用Courier New之类的字体,这种字体的间距是恒定的。不能解决所有问题,只能在测试时“最小化”噪声。RTF是错误的。Word可以生成RTF,并在写字板中正确对齐。当我尝试时,反向工程RTF是一个pita。正如您所猜测的,我的应用程序中的代码比我发布的简化示例要复杂得多。我使用RTF,以便一些编程定义的短语可以以粗体或下划线输出。尝试使用制表符对齐列的原因是使用比例字体。您对WinForms的假设是正确的。感谢您的努力,以及RichText不支持对齐选项卡(+1)的事实。但是,我当前应用程序的用户可能不喜欢对齐的小数位数,因此无法在此应用程序中实现此解决方案。幸运的是,对于确实需要它的应用程序,答案将是StackOverflow。