【问题标题】:Align numbers in RichTextBox在 RichTextBox 中对齐数字
【发布时间】:2016-02-28 18:04:27
【问题描述】:

我想在 C# 中打印一个乘法表,但它没有对齐! 当我们在文本框中输入数字“n”时,表示:n*n 表。 我能做什么?

for (int i = 1; i <= Convert.ToInt32(textBox1.Text); i++)
{
    for (int j = 1; j <= Convert.ToInt32(textBox1.Text); j++)
    {
        richTextBox1.Text += Convert.ToString(i * j) + " ";
    }
    richTextBox1.Text += "\n";
}

【问题讨论】:

  • 尝试使用制表符代替空格。 richTextBox1.Text += Convert.ToString(i * j) + "\t";
  • 设置RichTextBox的字体为Courier New,然后通过填充乘法结果将文本添加到RichTextBox:this.richTextBox1.AppendText(string.Format("{0,3 }", i * j));

标签: c# .net winforms richtextbox


【解决方案1】:

RichTextBox 的字体设置为等宽字体Courier New,然后使用String.Format 将文本添加到RichTextBox 并设置乘法结果的对齐方式。用正数右对齐,用负数左对齐:

var n = 5;
for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= n; j++)
    {
        this.richTextBox1.AppendText(string.Format("{0,3}", i * j));
    }
    this.richTextBox1.AppendText(Environment.NewLine);
}

代替{0,3} 格式化结果,您可以使用下面的代码根据最大字符长度格式化是属于n*n 的数字:

左对齐:

string.Format("{0,-" +((n*n).ToString().Length + 1).ToString() +"}", i * j)

右对齐:

string.Format("{0," +((n*n).ToString().Length + 1).ToString() +"}", i * j)

【讨论】:

    【解决方案2】:

    如果您想使用空格对齐,则需要使用等宽字体(如 Courier 或 Consolas),否则您可以使用制表符:数字不会以这种方式对齐,因为您的例程中的数字可以得到相当大,你最终可能会让你的数字占据比制表符分隔更多的地方,如果发生这种情况,对齐会出现不一致。

    作为一般规则,如果您想对齐任何类型的文本框,请使用等宽字体。

    您可以使用空格填充,例如使用String.PadLeftString.PadRight

    这就像改变一样简单:

    richTextBox1.Text += Convert.ToString(i * j) + " ";
    

    richTextBox1.Text += Convert.ToString(i * j).PadLeft(5);
    

    但是这会假设所有数字的宽度最多为 5 个字符。

    对于您的精确例程,您可以计算最大宽度,因此您最终会得到如下结果:

     // convert your input only once
     int myNumber = Convert.ToInt32(textBox1.Text);
     // pad with the maximum possible length, plus one space
     int padAmount = (myNumber * myNumber).ToString().Length + 1; 
     for (int i = 1; i <= myNumber; i++)
     {
       for (int j = 1; j <= myNumber; j++)
       {
         // pad your input by the amount of spaces needed to fit all possible numbers
         richTextBox1.Text += (i*j).ToString().PadLeft(padAmount);
       }
     }
     // use Environment.NewLine instead of `\n`
     richTextBox1.Text += Environment.NewLine;
    

    这是fiddle。这是(出于明显的原因)控制台,所以在我的小提琴中,输入数字是固定的(它在myNumber),输出只是一个字符串(而不是richTextBox1.Text),但它应该显示它是如何工作的。

    虽然我做了一些更改(我只转换了一次输入数字,并使用Environment.NewLine 而不是\n),但这远非最佳,您应该构建您的字符串(使用StringBuilder ) 并立即分配它,而不是添加到 Text 属性中。我用这种方法创建了一个fiddle,仅使用StringBuilder,内存消耗就减少了30mb以上(只有几kb)。

    【讨论】:

      【解决方案3】:

      我认为最好的解决方案是使用制表符代替特殊字体并使用空格填充。

      对于标签,您必须在每个数字后添加"\t""\t" 将被评估为 tab-字符。

      for (int i = 1; i <= Convert.ToInt32(textBox1.Text); i++)
      {
          for (int j = 1; j <= Convert.ToInt32(textBox1.Text); j++)
          {
              richTextBox1.Text += Convert.ToString(i * j) + "\t "; //here at the end
          }
          richTextBox1.Text += "\n";
      }
      

      但重要的是,选项卡具有固定宽度。如果您的号码太长,您需要 2 个标签用于短号码。但是对于像你这样的小桌子,这没问题。

      您可以使用SelectionTabs 属性更改选项卡的位置:

      this.richTextBox1.SelectionTabs = new[] { 20, 40, 60, 80 };
      

      顺便说一句,您应该使用StringBuilder 将多个字符串部分连接为一个。并且在每次迭代中只解析一次 textBox1 中的数字会更有效。

      var sb = new StringBuilder(); //In namespace System.Text
      var x = Convert.ToInt32(textBox1.Text); //parse only once 
      for (int i = 1; i <= x; i++)
      {
          for (int j = 1; j <= x; j++)
          {
              sb.Append(Convert.ToString(i * j));
              sb.Append("\t ");
          }
          sb.Append("\n");
      }
      richTextBox1.Text += sb.ToString();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2011-09-05
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多