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

Lay*_*yla 273 .net c#

我建立一个应用程序,我应该抓住几个值,并建立一个文本与他们同在Name,Age等等.

输出将是一个纯文本TextBox.

我试图让这些信息显示出来columns,因此我试图将它们分开tab以使其更清晰.

例如,而不是:

Ann 26
Sarah 29
Paul 45
Run Code Online (Sandbox Code Playgroud)

我希望它显示为:

Ann tab 26 Sarah tab 29 Paul tab 45

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

DSh*_*ook 446

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


Dan*_*n R 427

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

\' 单引号.

\" 双引号.

\\ 反斜杠.

\0 对于空字符.

\a 对于警报角色.

\b 对于退格.

\f 用于换页.

\n 换一条新线.

\r 回程.

\t 对于水平标签.

\v 对于垂直选项卡.

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

\x是相同的\u,但你不需要前导零(例如\x20).

\Uxxxxxxxx 对于unicode字符十六进制值(生成代理所需的更长形式).

  • 你在哪里找到这些数据?我想知道我的参考. (8认同)
  • @QueueHammer rom Jon Skeet 本人,似乎... https://devblogs.microsoft.com/csharpfaq/what-c​​haracter-escape-sequences-are-available/ (2认同)

dav*_*ine 72

它也可以是有用的String.Format,例如

String.Format("{0}\t{1}", FirstName,Count);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为代码说话长于一个衬里和长解释. (17认同)

sch*_*ebe 6

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

\n\n

问题

\n\n

"\\t"简单使用or的问题vbTab是,当显示多个 TextBox 且所有 TextBox 必须遵守对齐方式时,唯一的"\\t"vbTab解决方案将显示并不总是正确对齐的内容。

\n\n

VB.Net 中的示例:

\n\n
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load\n    TextBox1.Text = "Bernard" + vbTab + "32"\n    TextBox2.Text = "Luc" + vbTab + "47"\n    TextBox3.Text = "Fran\xc3\xa7ois-Victor" + vbTab + "12"\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n\n

将显示

\n\n

在此输入图像描述

\n\n

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

\n\n

解决方案

\n\n

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

\n\n
Public Class Form1\n\n    Public Declare Function SendMessage _\n        Lib "user32" Alias "SendMessageA" _\n        ( ByVal hWnd As IntPtr _\n        , ByVal wMsg As Integer _\n        , ByVal wParam As Integer _\n        , ByVal lParam() As Integer _\n        ) As Integer\n\n    Private Const EM_SETTABSTOPS As Integer = &HCB\n\n    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load\n        Dim tabs() As Integer = {4 * 25}\n\n        TextBox1.Text = "Bernard" + vbTab + "32"\n        SendMessage(TextBox1.Handle, EM_SETTABSTOPS, 1, tabs)\n        TextBox2.Text = "Luc" + vbTab + "47"\n        SendMessage(TextBox2.Handle, EM_SETTABSTOPS, 1, tabs)\n        TextBox3.Text = "Fran\xc3\xa7ois-Victor" + vbTab + "12"\n        SendMessage(TextBox3.Handle, EM_SETTABSTOPS, 1, tabs)\n    End Sub\n\nEnd Class\n
Run Code Online (Sandbox Code Playgroud)\n\n

将显示以下表格

\n\n

在此输入图像描述

\n\n

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

\n\n

评论

\n\n

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

\n\n

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

\n\n

这个问题已经在StackOverflow上得到处理

\n\n

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

\n\n

C# 解决方案

\n\n
using System;\nusing System.Windows.Forms;\nusing System.Runtime.InteropServices;\n\nnamespace WindowsFormsApp1\n{\n    public partial class Form1 : Form\n    {\n        [DllImport("User32.dll", CharSet = CharSet.Auto)]\n        private static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, uint[] lParam);\n        private const int EM_SETTABSTOPS = 0x00CB;\n        private const char vbTab = \'\\t\';\n\n        public Form1()\n        {\n            InitializeComponent();\n\n            var tabs = new uint[] { 25 * 4 };\n\n            textBox1.Text = "Bernard" + vbTab + "32";\n            SendMessage(textBox1.Handle, EM_SETTABSTOPS, 1, tabs);\n            textBox2.Text = "Luc" + vbTab + "47";\n            SendMessage(textBox2.Handle, EM_SETTABSTOPS, 1, tabs);\n            textBox3.Text = "Fran\xc3\xa7ois-Victor" + vbTab + "12";\n            SendMessage(textBox3.Handle, EM_SETTABSTOPS, 1, tabs);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n