我正在构建一个应用程序,我应该捕获几个值并使用它们构建一个文本:姓名、年龄等。

输出将是一个纯文本到一个文本框。

我试图使这些信息出现在一种列,因此我试图用tab分开它们,使它更清楚。

例如,不要有:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

Ann    26
Sarah  29
Paul   45

任何提示如何插入标签到我的文本?


当前回答

string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

这很好,但你必须有一个单一行距字体。

其他回答

var text = "Ann@26"

var editedText = text.Replace("@", "\t");

有几种方法可以做到这一点。最简单的方法是在文本中使用\t。然而,有可能\t在某些情况下不工作,如PdfReport nuget包。

使用String也很有用。格式,如。

String.Format("{0}\t{1}", FirstName,Count);

哈扎尔是对的。下面是c#中转义字符的完整列表:

\'表示一个单引号。

作为双引号。

\\表示反斜杠。

\0表示空字符。

\a表示警告字符。

\b表示退格。

\f表示表单提要。

\n为一个新的行。

\r表示马车返回。

\t用于水平制表符。

\v表示垂直制表符。

\uxxxx表示unicode字符十六进制值(例如\u0020)。

\x和\u是一样的,但是你不需要前导零(例如\x20)。

\Uxxxxxxxx表示unicode字符十六进制值(生成代理时需要较长的格式)。

使用Microsoft Winform控件,如果没有我将在下面解释的一些变通方法,就不可能正确地解决问题。

问题

在使用简单的“\t”或vbTab的问题是,当一个以上的文本框显示,对齐必须尊重所有的文本框,只有“\t”或vbTab解决方案将显示的东西,并不总是正确对齐。

在VB中的例子。Net:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TextBox1.Text = "Bernard" + vbTab + "32"
    TextBox2.Text = "Luc" + vbTab + "47"
    TextBox3.Text = "François-Victor" + vbTab + "12"
End Sub

将显示

正如你所看到的,François-Victor的年龄值被移到了右边,并没有与其他两个文本框的年龄值对齐。

解决方案

要解决这个问题,必须使用特定的SendMessage() user32.dll API函数设置制表符的位置,如下所示。

Public Class Form1

    Public Declare Function SendMessage _
        Lib "user32" Alias "SendMessageA" _
        ( ByVal hWnd As IntPtr _
        , ByVal wMsg As Integer _
        , ByVal wParam As Integer _
        , ByVal lParam() As Integer _
        ) As Integer

    Private Const EM_SETTABSTOPS As Integer = &HCB

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tabs() As Integer = {4 * 25}

        TextBox1.Text = "Bernard" + vbTab + "32"
        SendMessage(TextBox1.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox2.Text = "Luc" + vbTab + "47"
        SendMessage(TextBox2.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox3.Text = "François-Victor" + vbTab + "12"
        SendMessage(TextBox3.Handle, EM_SETTABSTOPS, 1, tabs)
    End Sub

End Class

和以下表格将显示

现在你可以看到,所有的值都正确对齐了:-)

讲话

文本框的多行属性必须设置为True。如果此属性设置为False,则Tab的位置与之前相同。

如何分配AcceptsTab属性并不重要(我已经测试过)。

这个问题在StackOverflow上已经处理过了

注意:制表符位置的测量单位不是字符,而是字符的1/4。这就是为什么我把长度乘以4。

c#的解决方案

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, uint[] lParam);
        private const int EM_SETTABSTOPS = 0x00CB;
        private const char vbTab = '\t';

        public Form1()
        {
            InitializeComponent();

            var tabs = new uint[] { 25 * 4 };

            textBox1.Text = "Bernard" + vbTab + "32";
            SendMessage(textBox1.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox2.Text = "Luc" + vbTab + "47";
            SendMessage(textBox2.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox3.Text = "François-Victor" + vbTab + "12";
            SendMessage(textBox3.Handle, EM_SETTABSTOPS, 1, tabs);
        }
    }
}