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

Posted

技术标签:

【中文标题】使用 C# 在文本中插入制表符【英文标题】:Inserting a tab character into text using C# 【发布时间】:2010-09-26 20:07:20 【问题描述】:

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

输出将是纯文本到TextBox

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

例如,而不是:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

tab 26 莎拉 tab 29 保罗 tab 45

关于如何在我的文本中insert 选项卡的任何提示?

【问题讨论】:

一句警告.....如果名称字段的长度太长,您仍然无法让它们对齐。 “安”只有3个字。 “Jeremiah”是 8。添加到“Ann”的单个选项卡可能会使 ## 出现在 jeremiah 的结尾之前。我建议按字符数进行解析。按空格“拆分”,将空格添加到第一个成员直到 12 个字符,然后添加“26”。如果您的名称可能超过 12,请调整 我刚刚在发布解决方案后阅读了 KeachyPeenReturns 的评论。他的话是正确的,但他的解决方案并不完美。最佳答案已经不正确。请花时间阅读我的解决方案并更新此问题的状态(最佳答案)。通常情况下,我不会发布此类评论,但问题已经很老了。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

\' 用于单引号。

\" 用于双引号。

\\ 表示反斜杠。

\0 为空字符。

\a 表示警报字符。

\b 用于退格。

\f 用于换页。

\n 换行。

\r 用于回车。

\t 用于水平标签。

\v 用于垂直制表符。

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

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

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

【讨论】:

您在哪里找到这些数据?我想知道以供参考。 @QueueHammer rom Jon Skeet 本人,看来...devblogs.microsoft.com/csharpfaq/…【参考方案3】:

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

String.Format("0\t1", FirstName,Count);

【讨论】:

这是最好的答案,因为代码比一个衬里和长解释要长。【参考方案4】:
var text = "Ann@26"

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

【讨论】:

【参考方案5】:

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

会显示

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

解决方案

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

会显示以下表格

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

备注

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

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

这个问题已经在***处理过

注意: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);
        
    

【讨论】:

【参考方案6】:

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

【讨论】:

\t 不起作用的情况下,添加有关如何添加选项卡的信息会很有用。 ;)【参考方案7】:

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

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

将导致Apple:<tab>Bob

【讨论】:

【参考方案8】:
string St = String.Format("0,-20 1,5:N1\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

这很好用,但您必须使用等距字体。

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

以上是关于使用 C# 在文本中插入制表符的主要内容,如果未能解决你的问题,请参考以下文章

强制 emacs 使用制表符而不是多个空格

制表符分隔文件中的引号

word中制表位是啥意思?

从VBA将制表符插入word文档

如何在文本中添加/插入 xml 节点

在 vba 中手动创建制表符分隔的文本文件