在RichtextBox中对齐

时间:2013-07-25 07:21:35

标签: c# winforms richtextbox

使用此:

richTextBox1.AppendText("EMPID: " + "\t\t" + "4001");
richTextBox1.AppendText(System.Environment.NewLine);
richTextBox1.AppendText(System.Environment.NewLine);
richTextBox1.AppendText("EmployeeName: " + "\t\t" + "Taborjakol");

我明白了:

enter image description here

我将如何与它完美对齐:

enter image description here

4 个答案:

答案 0 :(得分:5)

您可以做的是更改RichTextBoxControl的标签位置。

richTextBox1.SelectionTabs = new int[] { 90, 180, 270, 360 };

richTextBox1.AppendText("EMPID: " + "\t\t" + "4001");
richTextBox1.AppendText(System.Environment.NewLine);
richTextBox1.AppendText(System.Environment.NewLine);
richTextBox1.AppendText("EmployeeName: " + "\t\t" + "Taborjakol");

SelectionsTab属性重新定义RichTextBox控件中每个选项卡使用的空格。您需要尝试使用标签设置来获得最佳的文本结果。

答案 1 :(得分:1)

替换最后一行代码
richTextBox1.AppendText("EmployeeName: " + "\t" + "Taborjakol");

答案 2 :(得分:1)

如果你不必使用richtextbox,你应该明确看看gridview,或者如果你使用第三方工具,如Telerik,DevCraft,ComponentOne和其他人,他们中的大多数将有一个名为Property Grid的控件,它有一个布局你可能会对此感兴趣。

如果在使用richtextbox时没有其他办法,则必须执行以下操作:

  1. 获取固定宽度字体或称为等宽字体http://en.wikipedia.org/wiki/Monospaced_font

  2. 评估与标签共享相同宽度的字符数量(我不知道字符数必须通过测试自行计算出来)

  3. 获取左侧文本的最大长度(我猜的是“列名” - 比如“EmployeeName”)

  4. 做一些数学 - 最大长度+一个标签= x个字符

  5. 现在使用必要的标签(可以是1到x之间的任何内容)填充左侧的剩余文本,以获得与4中计算的相同的字符数。

  6. 但是,富文本框再次不是这种场景的理想控制。

    修改

    这里有一些代码:

    public partial class Form1 : Form
    {
        private const int FetchTestData = 50;
        private const int TabCharLength = 5;
    
        public Form1()
        {
            InitializeComponent();
    
            //With this Fontsettings - 5 chars = 1 Tab - this changes with different fonts
            this.richTextBox1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    
            var type = typeof(TestData);
            var list = GetTestData();
            var maxProperty = GetMaxProperty(type);
            maxProperty = FillToNext(maxProperty);
            var properties = GetProperties(type);
    
            for (var i = 0; i < FetchTestData; i++)
            {
                var data = list[i];
    
                foreach (var propertyInfo in properties)
                {
                    richTextBox1.AppendText(propertyInfo.Name);
    
                    var tabs = GetNumberOfTabs(maxProperty, propertyInfo.Name.Length);
                    for (var j = 0; j < tabs; j++)
                        richTextBox1.AppendText("\t");
    
                    richTextBox1.AppendText(Convert.ToString(propertyInfo.GetValue(data)));
    
                    richTextBox1.AppendText(Environment.NewLine);
                }
    
                if (i >= FetchTestData - 1) 
                    continue;
    
                richTextBox1.AppendText(Environment.NewLine);
                richTextBox1.AppendText("---------- NEXT DATA ----------");
                richTextBox1.AppendText(Environment.NewLine);
            }
        }
    
        private int GetNumberOfTabs(int maxLength, int textLength)
        {
            if ((maxLength % TabCharLength) != 0)
                maxLength = FillToNext(maxLength);
    
            var difLength = maxLength - textLength;
    
            return (int)(Math.Floor(Convert.ToDouble(difLength / TabCharLength)) + 1);
        }
    
        private int FillToNext(int maxLength)
        {
            return maxLength + (5 - (maxLength % TabCharLength));
        }
    
        private PropertyInfo[] GetProperties(Type type)
        {
            if (type == null)
                throw new ArgumentNullException("type");
    
            return type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
        }
    
        private int GetMaxProperty(Type type)
        {
            if (type == null)
                throw new ArgumentNullException("type");
    
            return (from x in GetProperties(type)
                    select x.Name.Length).Max();
        }
    
        private List<TestData> GetTestData()
        {
            var returnValue = new List<TestData>();
    
            for (int i = 0; i < FetchTestData; i++)
            {
                returnValue.Add(new TestData()
                {
                    ID = i,
                    Name = "NameValue " + i,
                    Description = "DescriptionValue " + i,
                    PropertyA = "PropertyAValue " + i,
                    PropertyB = "PropertyBValue " + i,
                    SomeReallyLongPropertyName = "RandomStuff... " + i
                });
            }
    
            return returnValue;
        }
    }
    
    public class TestData
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string SomeReallyLongPropertyName { get; set; }
    }
    

答案 3 :(得分:0)

如前所述,您首先要将字体设置为单字体字体,这意味着每个字母的大小都相同。

所以你会看到这样的东西:

  

EEEEEEEEEEE

而不是

  

EeEeeiiiiiiiiiiiiiiiiii

其次,您可以对齐文本,这可能会略微改善它:

richTextBox1.SelectAll();
richTextBox1.SelectionAlignment = HorizontalAlignment.Center;

然而,除非你必须,我建议使用不同的控件:

  • 的GridView

  • 列表框

这些都很容易格式化,gridview有标签,输入值时可以使用string.Format的列表框。