使用 C 在文本中插入制表符#

Inserting a tab character into text using C#

提问人:Layla 提问时间:12/14/2008 最后编辑:schlebeLayla 更新时间:2/4/2023 访问量:722007

问:

我正在构建一个应用程序,我应该在其中捕获几个值并使用它们构建文本:、 等。NameAge

输出将是纯文本转换为 .TextBox

我试图使这些信息以某种方式出现,因此我试图将它们分开以使其更清晰。columnstab

例如,而不是具有:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

Ann    26
Sarah  29
Paul   45

关于如何将标签放入我的文本中的任何提示?insert

C# .NET vb.net

评论

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

答:

536赞 DShook 12/14/2008 #1

尝试在字符串中使用该字符\t

487赞 Dan R 12/14/2008 #2

哈扎尔对他的.下面是 C# 转义字符的完整列表:\t

\'对于单个报价。

\"用于双引号。

\\用于反斜杠。

\0对于 null 字符。

\a用于警报字符。

\b对于退格键。

\f用于表单源。

\n换行。

\r用于回车。

\t对于水平选项卡。

\v对于垂直选项卡。

\uxxxx对于 Unicode 字符十六进制值(例如 )。\u0020

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

\Uxxxxxxxx对于 Unicode 字符十六进制值(生成代理项需要更长的格式)。

评论

9赞 QueueHammer 1/26/2010
你在哪里找到这些数据?我想知道供我参考。
2赞 Leonard AB 3/11/2020
@QueueHammer rom Jon Skeet 本人,似乎......devblogs.microsoft.com/csharpfaq/......
81赞 david valentine 12/14/2008 #3

它也可以用于使用,例如String.Format

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

评论

17赞 Phil 8/11/2010
这是最好的答案,因为代码比一行字和冗长的解释更长。
2赞 Amin Saqi 6/27/2013 #4

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

评论

8赞 J. Scott Elblein 1/23/2018
添加有关如何在不起作用的情况下添加选项卡的信息会很有用。;)\t
4赞 MafazR 5/11/2015 #5
var text = "Ann@26"

var editedText = text.Replace("@", "\t");
1赞 CERI 2/15/2017 #6
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

这效果很好,但您必须具有等宽字体。

2赞 Hecatonchires 8/29/2018 #7

当使用文字字符串(以@“开头)时,这可能更容易

char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);

将导致Apple:<tab>Bob

1赞 Heersert 9/24/2018 #8

除了上面的 anwser 之外,您还可以使用 PadLeft 或 PadRight:

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

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

这将用左边或右边的空格填充字符串。

6赞 schlebe 1/30/2019 #9

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

问题

使用“简单”或的问题在于,当显示多个“文本框”并且必须遵循所有“文本框”的对齐方式时,“唯一”或“解决方案将显示一些并不总是正确对齐的内容。"\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

将显示

enter image description here

如您所见,值 for 向右移动,并且与另外两个 TextBox 的值不对齐。ageFrançois-Victorage

溶液

要解决此问题,您必须使用特定的 user32.dll API 函数设置选项卡位置,如下所示。SendMessage()

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

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

言论

MultilineTextBox 的属性必须设置为 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);
        }
    }
}