Я создаю приложение, в котором я должен захватить несколько значений и построить текст с ними: Имя
, Возраст
и т.д.
На выходе будет обычный текст в TextBox
.
Я пытаюсь сделать так, чтобы эта информация отображалась в виде колонок
, поэтому я пытаюсь разделить их табом
, чтобы сделать это более понятным.
Например, вместо того, чтобы иметь:
Ann 26
Sarah 29
Paul 45
я бы хотел, чтобы это отображалось как:
Энн tab 26 Сара tab 29 Пол tab 45
Подскажите, как "вставить" табуляцию в текст?
Попробуйте использовать символ \t
в своих строках
Хазар прав со своим \t
. Вот'полный список управляющих символов для C#:
\'
для одиночной кавычки.
\"
для двойной кавычки.
`\\\ для обратной косой черты.
\0
для нулевого символа.
\a
для символа предупреждения.
\b
для обратного пробела.
\f
для ввода формы.
\n
для новой строки.
\r
для возврата каретки.
\t
для горизонтальной табуляции.
\v
для вертикальной табуляции.
\uxxxx
для шестнадцатеричного значения символа юникода (например, \u0020
).
\x
- то же самое, что и \u
, но вам не нужны ведущие нули (например, \x20
).
\Uxxxxxxx
для шестнадцатеричного значения символа юникода (более длинная форма необходима для генерации суррогатов).
Также может быть полезно использовать String.Format
, например.
String.Format("{0}\t{1}", FirstName,Count);
var text = "Ann@26"
var editedText = text.Replace("@", "\t");
С помощью Майкрософт Winform управления, невозможно правильно решить вашу проблему без небольшой обходной путь, который я объясню ниже.
Проблема
Проблема в Через просто в "\Т" У
или vbTab-это когда больше чем одно текстовое поле отображаются и согласования должны соблюдаться на всем поле, только в
"\Т" Уили
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
будет отображать
как вы можете видеть, возраст
значение ФранçОИ-Виктор
сдвигается вправо и не совпадает с "возраст" значения двух других таблицах.
Решение
Чтобы решить эту проблему, необходимо установить позицию табуляции с помощью специальных метод 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
и после появится форма
Вы можете видеть, что теперь, все значения правильно :-)
Замечания
Многострочный
свойства элемента управления TextBox должен быть установлен в true. Если для этого свойства задано значение false, то на вкладке позиционируется как раньше.
Как AcceptsTab имущества назначается не важно (я проверял).
Этот вопрос уже будет рассматриваться на сайте StackOverflow
Внимание: единицы измерения на закладке позиция не характер, но, то, что кажется 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);
}
}
}
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;
Это хорошо работает, но вы должны иметь моноширинный шрифт.
При использовании символьных строк (начать с @ТО") это может быть легче
char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);
В результате Яблоко:<вкладка>Боб
Кроме ответов выше вы можете использовать PadLeft и PadRight:
string name = "John";
string surname = "Smith";
Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));
Это будет заполнить строку пробелами слева или справа.