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


283

我建立一个应用程序,我应该抓住几个值,并与他们建立良好的文字:NameAge等等。

输出将是纯文本格式TextBox

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

例如,与其具有:

Ann 26
Sarah 29
Paul 45

我希望显示为:

Ann 标签页 26 Sarah 标签页 29 Paul 标签页 45

关于如何insert将选项卡插入文本的任何提示?


提示一下.....如果名称字段的长度太长,您仍然无法使它们对齐。“安”只有3个字符。“耶利米”为8。添加到“安”的单个选项卡可能会使##出现在耶利米结束之前。我建议按字符数进行解析。“按空格分隔”,向第一个成员添加空格,直到12个字符,然后添加“ 26”。如果您的名字可能长于12,请进行调整
KeachyPeenReturns

发布解决方案后,我刚刚阅读了KeachyPeenReturns的评论。他的话是正确的,但他的解决办法并不完善。最佳答案已经不正确。请花点时间阅读我的解决方案并更新此问题的状态(最佳答案)。通常,我不会发布此类评论,但问题很老。
schlebe

Answers:



445

哈扎尔是对的\t。这是C#的转义字符的完整列表:

\' 单引号。

\" 双引号。

\\ 反斜杠。

\0 为空字符。

\a 警报字符。

\b 退格。

\f 用于换页。

\n 换一行。

\r 回车。

\t 用于水平制表符。

\v 用于垂直标签。

\uxxxx用于unicode字符的十六进制值(例如\u0020)。

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

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


8
您在哪里找到这些数据?我想知道供我参考。
QueueHammer 2010年

@QueueHammer ROM乔恩斯基特自己,似乎... devblogs.microsoft.com/csharpfaq/...
伦纳德AB

74

使用它也可能很有用String.Format,例如

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

17
这是最好的答案,因为代码讲的不止一个衬里和冗长的解释。
Phil

4
var text = "Ann@26"

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

2

有几种方法可以做到这一点。最简单的是\t在您的文本中使用。但是,\t在某些情况下(如PdfReportnuget包)可能无法正常工作。


4
\t不起作用的情况下添加有关如何添加选项卡的信息将很有用。;)
J. Scott Elblein

2

使用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

将显示

在此处输入图片说明

如您所见,agefor的值François-Victor向右移动,并且与age其他两个TextBox的值不对齐。

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

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

并显示以下表格

在此处输入图片说明

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

备考

MultilineTextBox的属性必须设置为True。如果将此属性设置为False,则选项卡的位置将与以前一样。

怎么样 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);
        }
    }
}

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

这很好用,但是您必须具有等宽字体。


1

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

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

会导致 Apple:<tab>Bob


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));

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.