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

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

输出将是一个纯文本到TextBox

我试图使这些信息以columns的形式出现,因此我试图用tab将它们分开,以使其更清楚。

例如,不要有:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

Ann    26
Sarah  29
Paul   45

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

690120 次浏览

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

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

\'为单引号。

\"为双引号。

\\为反斜杠。

\0为空字符。

\a为警告字符。

\b为退格符。

\f用于表单提要。

\n为一个新行。

\r用于回车。

\t用于水平制表符。

\v用于垂直制表符。

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

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

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

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

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

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

var text = "Ann@26"


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

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

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

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

会导致Apple:<tab>Bob

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

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


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

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

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

正如你所看到的,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属性。如果此属性设置为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);
}
}
}