使用C#将制表符插入文本

314

我将要构建一个应用程序,需要捕获多个值并使用它们来生成文本:NameAge等。

输出结果将是纯文本,显示在一个 TextBox 中。

我正在尝试让这些信息以一种类似于 的形式呈现,因此我正在尝试使用 制表符 将它们分开,以使其更清晰。

例如,不是像这样:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

Ann    26
Sarah  29
Paul   45

您有没有什么关于如何在文本中插入标签的技巧?


1
一个警告......如果名称字段的长度太长,它们仍然无法对齐。 "Ann" 只有3个字符。 "Jeremiah"有8个字符。给 "Ann" 添加一个制表符可能会使 ##出现在 jeremiah 的末尾之前。我建议按字符数分析。通过空格 "拆分",添加空格到第一个成员,直到12个字符,然后添加 "26"。如果您的名称可能超过12个字符,请进行调整。 - KeachyPeenReturns
我刚刚在发布了解决方案之后阅读了KeachyPeenReturns的评论。他的评论是正确的,但他的解决方案并不完美。最佳答案已经不正确了。请花点时间阅读我的解决方案,并更新此问题的状态(最佳答案)。通常,我不会发布这种类型的评论,但这个问题非常古老。 - schlebe
9个回答

536

尝试在您的字符串中使用\t字符。


487

Hazar的\t是正确的。以下是C#中所有转义字符的完整列表:

\'代表单引号。

\"代表双引号。

\\代表反斜杠。

\0代表空字符。

\a代表警报字符。

\b代表退格。

\f代表换页符。

\n代表换行符。

\r代表回车符。

\t代表水平制表符。

\v代表垂直制表符。

\uxxxx代表Unicode字符的十六进制值(例如\u0020)。

\x\u相同,但您不需要前导零(例如\x20)。

\Uxxxxxxxx代表Unicode字符的十六进制值(生成代理时需要使用较长的形式)。


9
你从哪里找到这些数据?我想知道以便参考。 - QueueHammer
2
据 Jon Skeet 本人所说,@QueueHammer... https://devblogs.microsoft.com/csharpfaq/what-character-escape-sequences-are-available/ - Leonard AB

81

使用String.Format也很有用,例如:

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

17
这是最佳答案,因为代码比一行简短的解释和长篇大论更能说明问题。 - Phil

6

使用 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-Victorage值向右移动,与其他两个文本框的age值不对齐。

解决方案

为了解决这个问题,您必须使用特定的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

以下表格将被显示:

enter image description here

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

备注

必须将TextBox的Multiline属性设置为True。如果此属性设置为False,则Tab的位置与以前相同。

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

此问题已在StackOverflow上讨论过。

注意:Tab位置的度量单位不是字符,而是似乎是字符的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);
        }
    }
}

4
var text = "Ann@26"

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

2
使用字面字符串(以@“开头)可能更容易。
char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);

会导致结果为苹果:<tab>鲍勃

2

有几种方法可以实现。最简单的方法是在文本中使用\t。然而,在某些情况下,如PdfReport nuget包中,\t可能无法正常工作。


8
如果\t无法正常使用,添加关于如何添加选项卡的信息将非常有用。;) - J. Scott Elblein

1

除了上面的答案,您还可以使用PadLeft或PadRight:

string name = "John";
string surname = "Smith";

Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));

这将在字符串左侧或右侧填充空格。

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

这很有效,但你必须使用等宽字体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接