Вставка символа табуляции в текст с использованием C #

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

Результатом будет простой текст в TextBox.

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

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

Ann 26
Sarah 29
Paul 45

Я хотел бы показать это как:

Ann Вкладка 26 Sarah Вкладка 29 Пол Вкладка 45

Любой совет о том, как insertвкладки в мой текст?

280 .netc#
14.12.2008 03:22:07
Слово предупреждения ..... если длина поля имени слишком велика, вы все равно не получите их для выравнивания. «Энн» составляет всего 3 символа. "Иеремия" - 8. Одна вкладка, добавленная к "Энн", может привести к появлению ## до конца Иеремии. Я бы предложил разбор по количеству символов. «Разделить» пробелом, добавить пробел к первому члену до 12 символов, а затем добавить «26». Если у вас есть имя, которое может быть длиннее 12, настройте
KeachyPeenReturns 10.11.2017 13:36:12
Я только что прочитал комментарий KeachyPeenReturns после публикации решения. Его замечание верно, но его решение несовершенно. ЛУЧШИЙ ответ уже неверен. Пожалуйста, найдите время, чтобы прочитать мое решение и обновить статус (ЛУЧШИЙ ответ) по этому вопросу. Обычно я не публикую комментарии такого типа, но вопрос очень старый.
schlebe 30.01.2019 07:01:36
9 ОТВЕТОВ
РЕШЕНИЕ

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

457
31.01.2012 12:50:46

Хазар прав со своим \t. Вот полный список escape-символов для C #:

\' за одну цитату.

\" за двойную цитату.

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

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

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

\b для возврата.

\f для подачи формы.

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

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

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

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

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

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

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

440
3.06.2014 13:22:51
Где вы нашли эти данные? Я хотел бы знать для моей справки.
QueueHammer 25.01.2010 19:49:02
@QueueHammer от самого Джона Скита, кажется ... devblogs.microsoft.com/csharpfaq/…
Leonard AB 11.03.2020 04:36:31

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

String.Format("{0}\t{1}", FirstName,Count);
74
31.01.2012 12:20:27
Это лучший ответ, потому что код говорит дольше чем один вкладыш и длинные объяснения.
Phil 10.08.2010 19:44:49

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

2
27.06.2013 06:38:56
Было бы полезно добавить информацию о том, как добавить вкладку в случае, если \tне работает. ;)
J. Scott Elblein 23.01.2018 14:23:27
var text = "Ann@26"

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

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

1
31.08.2017 06:23:01

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

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

Приведет к Apple:<tab>Bob

1
29.08.2018 01:38:07

В дополнение к вышеприведенным anwsers вы можете использовать PadLeft или PadRight:

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

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

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

1
24.09.2018 07:39:34

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

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

введите описание изображения здесь

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

РЕШЕНИЕ

Чтобы решить эту проблему, вы должны установить положение вкладок с помощью специальной SendMessage()функции API 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

и следующая форма будет отображаться

введите описание изображения здесь

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

ВЫСТУПЛЕНИЯ

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

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

Этот вопрос уже был обработан в StackOverflow

Предостережение: позиция mesure Unit for 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);
        }
    }
}
2
30.01.2019 06:56:10