Вставлення символу вкладки в текст за допомогою C #


283

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

Виведенням буде звичайний текст у a TextBox.

Я намагаюся зробити так, щоб ці відомості виглядали начебто columns, тому я намагаюсь відокремити їх, tabщоб зробити їх зрозумілішими.

Наприклад, замість того, щоб:

Ann 26
Sarah 29
Paul 45

Я хотів би, щоб це показало як:

Ann Вкладка 26 Sarah Вкладка 29 Стать Вкладка 45

Будь-яка порада щодо insertвкладки в текст?


Слово попередження ..... якщо довжина поля імені занадто довга, ви все одно не змусите їх вирівняти. "Енн" - це лише 3 символи. "Єремія" дорівнює 8. Одна вкладка, додана до "Енн", може призвести до появи ## до кінця ієремії. Я б запропонував розібрати кількість символів. "Розбийте" на пробіл, додайте пробіли до першого члена до 12 символів, а потім додайте "26". Якщо у вас є ім’я, яке може перевищувати 12, відрегулюйте
KeachyPeenReturns

Я просто прочитав коментар KeachyPeenReturns після публікації рішення. Його зауваження правильне, але його рішення недосконале. НАЙКРАЩА відповідь вже невірна. Будь ласка, знайдіть час, щоб прочитати моє рішення та оновити статус (НАЙКРАЩА відповідь) на це питання. Зазвичай я не публікую цей коментар, але питання дуже старе.
schlebe

Відповіді:


460

Спробуйте використовувати \tсимвол у своїх струнах


445

Хазар має рацію зі своїм \t. Ось повний список символів втечі для C #:

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

\" для подвійної цитати.

\\ для зворотної косої риски.

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

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

\b для зворотного простору.

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

\n для нового рядка.

\r для повернення вагона.

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

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

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

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

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


8
Де ви знайшли ці дані? Я хотів би дізнатися для своєї довідки.
QueueHammer

@QueueHammer rom Джон Джон Скіт, здається ... devblogs.microsoft.com/csharpfaq/…
Леонард AB

74

Він також може бути корисним для використання String.Format, наприклад

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

17
Це найкраща відповідь, оскільки код говорить довше, ніж один вкладиш і довгі пояснення.
Філ


2

Існує кілька способів зробити це. Найпростішим є використання \tу вашому тексті. Однак можливо, що \tце не спрацьовує в деяких ситуаціях, як-от PdfReportnuget пакет.


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.

РІШЕННЯ

Щоб вирішити цю проблему, потрібно встановити позицію Tabs за допомогою певної SendMessage()функції API API32.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 . Якщо для цих властивостей встановлено значення False, вкладка розміщується як і раніше.

Як AcceptsTab призначити властивість, не важливо (я перевірив).

Це питання вже розглядається в StackOverflow

Застереження: мезоджер для позиції 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.