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


284

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

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

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

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

Ann 26
Sarah 29
Paul 45

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

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

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


Слово предупреждения ..... если длина поля имени слишком велика, вы все равно не получите их для выравнивания. «Энн» составляет всего 3 символа. "Иеремия" - 8. Одна вкладка, добавленная к "Энн", может привести к появлению ## до конца Иеремии. Я бы предложил разбор по количеству символов. "Разделить" пробелом, добавить пробел к первому члену до 12 символов, а затем добавить "26". Если у вас есть имя, которое может быть длиннее 12, настройте
KeachyPeenReturns

Я только что прочитал комментарий KeachyPeenReturns после публикации решения. Его замечание верно, но его решение несовершенно. ЛУЧШИЙ ответ уже неверен. Пожалуйста, найдите время, чтобы прочитать мое решение и обновить статус (ЛУЧШИЙ ответ) по этому вопросу. Обычно я не публикую комментарии такого типа, но вопрос очень старый.
Шлебе

Ответы:


461

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


445

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


8
Где вы нашли эти данные? Я хотел бы знать для моей справки.
QueueHammer

@QueueHammer от самого Джона Скита, кажется ... devblogs.microsoft.com/csharpfaq/…
Леонард А.Б.

74

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

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

17
Это лучший ответ, потому что код говорит дольше чем один вкладыш и длинные объяснения.
Фил


2

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


4
Было бы полезно добавить информацию о том, как добавить вкладку в случае, если \tне работает. ;)
Дж. Скотт Эльблейн

2

Используя 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значение для 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);
        }
    }
}

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

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


1

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

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

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


1

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.