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

64jmpszr  于 2023-02-06  发布在  .NET
关注(0)|答案(9)|浏览(247)

我正在构建一个应用程序,其中我应该捕获几个值并使用它们构建一个文本:NameAge等等。
输出将是TextBox中的纯文本。
我试图使这些信息以columns的形式出现,因此我试图用tab将它们分开,以使其更清楚。
例如,代替具有:

Ann 26
Sarah 29
Paul 45

我希望它显示为:

Ann    26
Sarah  29
Paul   45

关于如何将标签插入我的文本中有什么建议吗?

yh2wf1be

yh2wf1be1#

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

gajydyqb

gajydyqb2#

Hazar的\t是正确的,下面是C#转义字符的完整列表:
\'表示单引号。
\"表示双引号。
\\表示反斜杠。
\0表示空字符。
\a表示警报字符。
\b用于退格。
\f表示换页。
\n表示一个新行。
\r表示回车。
\t表示水平选项卡。
\v表示垂直选项卡。
\uxxxx表示Unicode字符十六进制值(例如\u0020)。
\x\u相同,但不需要前导零(例如\x20)。
\Uxxxxxxxx表示unicode字符十六进制值(生成代理项需要较长的格式)。

f0ofjuux

f0ofjuux3#

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

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

up9lanfz4#

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

    • 问题**

简单使用"\t"vbTab的问题是,当显示多个TextBox时,必须考虑所有TextBox的对齐方式,只有"\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函数设置制表符位置,如下所示。

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

将显示以下表单

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

    • 备注**

TextBoxMultiline属性必须设置为True。如果此属性设置为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);
        }
    }
}
djp7away

djp7away5#

var text = "Ann@26"

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

rqmkfv5c6#

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

lndjwyie

lndjwyie7#

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

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

将导致Apple:<tab>Bob

yhuiod9q

yhuiod9q8#

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

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

7ajki6be

7ajki6be9#

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

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

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

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

相关问题