如何将格式化的 richtextbox 对齐到 Columns NET c#

How to align formatted richtextbox into Columns NET c#

我有账单之类的数据, 编号 |项目 |总价 我需要像 table 一样打印它们,但使用 richtextbox。 我找到了一些代码,但问题是我必须从右到左对齐数字,从左到右对齐项目文本。

像这样

ID  Item                                                     TotalPrice
1   Monitor TV 10 cm                                            100.50
1.1 HP DESKJET 3630 /3636 MULTIFUNKTIONS WIFI DRUCKER            49.50
1.2 Canon PIXMA MG5750 Tintenstrahldrucker Multifunktionsgerät   99.60
2   Dell UltraSharp U2715H 69 cm (27 Zoll) 16:9                 610.82
3   15.6' (39,62cm) HP 250 G5 I5/8GB/1TB/W10Home                508.02

但我得到了这个:

ID  Item                                                     TotalPrice
1   Monitor TV 10 cm                               100.50
1.1 HP DESKJET 3630 /3636 MULTIFUNKTIONS WIFI DRUCKER            49.50
1.2 Canon PIXMA MG5750 Tintenstrahldrucker Multifunktionsgerät                       99.60
2   Dell UltraSharp U2715H 69 cm (27 Zoll) 16:9                    610.82
3   15.6' (39,62cm) HP 250 G5 I5/8GB/1TB/W10Home                                       508.02

我的 C# 代码是这样的:

 foreach (DataRow dr_pos in GenerateData().Rows)
            {
                richTextBox1.Text += dr_pos[0].ToString().PadRight(5, ' ') 
                                    + dr_pos[1].ToString().PadLeft(0, ' ') 
                                    + dr_pos[2].ToString().PadLeft( 40 , ' ')  ;

               richTextBox1.Text +=   Environment.NewLine;
            }

 private DataTable GenerateData()
        {
            DataTable table = new DataTable();
            for (int i = 0; i < 3; i++)
            {
                table.Columns.Add("Column " + i.ToString(), typeof(string));
            }           
            {
                // Header
                DataRow dr = table.NewRow();
                dr[0] = "ID";
                dr[1] = "Item";
                dr[2] = "TotalPrice";
                table.Rows.Add(dr);

                // Data 0
                dr = table.NewRow();
                dr[0] = "1";
                dr[1] = "Monitor TV 10 cm";
                dr[2] = "100.50";
                table.Rows.Add(dr);

                // Data 1
                dr = table.NewRow();
                dr[0] = "1.1";
                dr[1] = @"HP DESKJET 3630 /3636 MULTIFUNKTIONS WIFI DRUCKER  ";
                dr[2] = "49.50";
                table.Rows.Add(dr);
                // Data 2
                dr = table.NewRow();
                dr[0] = "1.2";
                dr[1] = @"Canon PIXMA MG5750 Tintenstrahldrucker Multifunktionsgerät";
                dr[2] = "99.60";
                table.Rows.Add(dr);

                // Data 3
                dr = table.NewRow();
                dr[0] = "2";
                dr[1] = @"Dell UltraSharp U2715H 69 cm (27 Zoll) 16:9 ";
                dr[2] = "610.82";
                table.Rows.Add(dr);

                // Data 4
                dr = table.NewRow();
                dr[0] = "2";
                dr[1] = @"15.6' (39,62cm) HP 250 G5 I5/8GB/1TB/W10Home";
                dr[2] = "508.02";
                table.Rows.Add(dr);

                return table;
        }
        }           

我阅读了很多文章和解决方案,但它们并不如我所愿。

提前致谢

这里有一个例子,演示了我在上面评论中提供的原则的使用:

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var table = GenerateData();
            var maxNameLength = table.AsEnumerable().Max(row => ((string) row[1]).Length);
            var formatSpecifier = "{0,-5}{1,-" + (maxNameLength + 2) + "}{2,10}\r\n";

            foreach (DataRow row in table.Rows)
            {
                richTextBox1.AppendText(string.Format(formatSpecifier, row[0], row[1], row[2]));
            }
        }

        private DataTable GenerateData()
        {
            DataTable table = new DataTable();
            for (int i = 0; i < 3; i++)
            {
                table.Columns.Add("Column " + i.ToString(), typeof(string));
            }

            // Header
            DataRow dr = table.NewRow();
            dr[0] = "ID";
            dr[1] = "Item";
            dr[2] = "TotalPrice";
            table.Rows.Add(dr);

            // Data 0
            dr = table.NewRow();
            dr[0] = "1";
            dr[1] = "Monitor TV 10 cm";
            dr[2] = "100.50";
            table.Rows.Add(dr);

            // Data 1
            dr = table.NewRow();
            dr[0] = "1.1";
            dr[1] = @"HP DESKJET 3630 /3636 MULTIFUNKTIONS WIFI DRUCKER  ";
            dr[2] = "49.50";
            table.Rows.Add(dr);
            // Data 2
            dr = table.NewRow();
            dr[0] = "1.2";
            dr[1] = @"Canon PIXMA MG5750 Tintenstrahldrucker Multifunktionsgerät";
            dr[2] = "99.60";
            table.Rows.Add(dr);

            // Data 3
            dr = table.NewRow();
            dr[0] = "2";
            dr[1] = @"Dell UltraSharp U2715H 69 cm (27 Zoll) 16:9 ";
            dr[2] = "610.82";
            table.Rows.Add(dr);

            // Data 4
            dr = table.NewRow();
            dr[0] = "2";
            dr[1] = @"15.6' (39,62cm) HP 250 G5 I5/8GB/1TB/W10Home";
            dr[2] = "508.02";
            table.Rows.Add(dr);

            return table;
        }
    }
}

我测试了那个确切的代码,它对我有用。

我认为你应该在第二个字段上使用 PadRight。就一个padleft(0),那么数字上的padleft(40)不可能是对的。例如:

richTextBox1.Text += dr_pos[0].ToString().PadRight(5, ' ') 
                                + dr_pos[1].ToString().PadRight(40, ' ') 
                                + dr_pos[2].ToString().PadLeft(5, ' ')  ;

顺便说一句,您必须为文本框设置等宽字体才能工作。