Вставка символа табуляции в текст с помощью С#

Я создаю приложение, где я должен записывать несколько значений и строить с ними текст: Name, Age и т.д.

Вывод будет простым текстом в TextBox.

Я пытаюсь сделать эту информацию в виде columns, поэтому я пытаюсь отделить их tab, чтобы сделать ее более ясной.

Например, вместо того, чтобы иметь:

Ann 26
Sarah 29
Paul 45

Мне бы хотелось, чтобы он показывался как:

Ann tab 26 Sarah tab 29 Paul tab 45

Какой-нибудь совет по insert вкладкам в мой текст?

Ответ 1

Попробуйте использовать символ \t в ваших строках

Ответ 2

Хазар прав со своим \t. Здесь полный список escape-символов для С#:

\' для одной кавычки.

\" для двойной кавычки.

\\ для обратной косой черты.

\0 для нулевого символа.

\a для символа предупреждения.

\b для обратного пространства.

\f для фида.

\n для новой строки.

\r для возврата каретки.

\t для горизонтальной вкладки.

\v для вертикальной вкладки.

\uxxxx для шестнадцатеричного значения символа unicode (например, \u0020).

\x совпадает с \u, но вам не нужны ведущие нули (например, \x20).

\Uxxxxxxxx для шестнадцатеричного символа символа юникода (более длинная форма, необходимая для генерации суррогатов).

Ответ 3

Также может быть полезно использовать String.Format, например.

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

Ответ 5

Есть несколько способов сделать это. Простейший использует \t в вашем тексте. Однако возможно, что \t не работает в некоторых ситуациях, например, PdfReport пакет nuget.

Ответ 6

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

Это хорошо работает, но у вас должен быть шрифт с одним интервалом.

Ответ 7

При использовании буквенных строк (начинаются с @") это может быть проще

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

Результатом станет Apple:<tab>Bob

Ответ 8

В дополнение к вышеописанным функциям вы можете использовать PadLeft или PadRight:

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

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

Это заполнит строку пробелами слева или справа.

Ответ 9

Используя 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

будет отображать

enter image description here

Как вы можете видеть, age значение для François-Victor смещено вправо и не соответствует age значению двух других TextBox.

РЕШЕНИЕ

Чтобы решить эту проблему, вы должны установить положение вкладок с помощью определенной функции API SendMessage() user32.dll, как показано ниже.

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

Теперь видно, что все значения правильно выровнены :-)

ВЫСТУПЛЕНИЯ

Multiline свойство TextBox должно быть установлено в True. Если для этого свойства установлено значение False, вкладка будет расположена, как и раньше.

Как AcceptsTab свойство AcceptsTab не важно (я проверял).

Этот вопрос уже был обработан на fooobar.com/info/297932/...

Предостережение: позиция mesure Unit for Tab - это не символ, а что-то вроде 1/4 символа. Вот почему я умножаю длину на 4.

С# РЕШЕНИЕ

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