Ответ 1
Попробуйте использовать символ \t
в ваших строках
Я создаю приложение, где я должен записывать несколько значений и строить с ними текст: Name
, Age
и т.д.
Вывод будет простым текстом в TextBox
.
Я пытаюсь сделать эту информацию в виде columns
, поэтому я пытаюсь отделить их tab
, чтобы сделать ее более ясной.
Например, вместо того, чтобы иметь:
Ann 26
Sarah 29
Paul 45
Мне бы хотелось, чтобы он показывался как:
Ann tab 26 Sarah tab 29 Paul tab 45
Какой-нибудь совет по insert
вкладкам в мой текст?
Попробуйте использовать символ \t
в ваших строках
Хазар прав со своим \t
. Здесь полный список escape-символов для С#:
\'
для одной кавычки.
\"
для двойной кавычки.
\\
для обратной косой черты.
\0
для нулевого символа.
\a
для символа предупреждения.
\b
для обратного пространства.
\f
для фида.
\n
для новой строки.
\r
для возврата каретки.
\t
для горизонтальной вкладки.
\v
для вертикальной вкладки.
\uxxxx
для шестнадцатеричного значения символа unicode (например, \u0020
).
\x
совпадает с \u
, но вам не нужны ведущие нули (например, \x20
).
\Uxxxxxxxx
для шестнадцатеричного символа символа юникода (более длинная форма, необходимая для генерации суррогатов).
Также может быть полезно использовать String.Format
, например.
String.Format("{0}\t{1}", FirstName,Count);
var text = "[email protected]"
var editedText = text.Replace("@", "\t");
Есть несколько способов сделать это. Простейший использует \t
в вашем тексте. Однако возможно, что \t
не работает в некоторых ситуациях, например, PdfReport
пакет nuget.
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);
Результатом станет Apple:<tab>Bob
В дополнение к вышеописанным функциям вы можете использовать PadLeft или PadRight:
string name = "John";
string surname = "Smith";
Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));
Это заполнит строку пробелами слева или справа.
Используя 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.
РЕШЕНИЕ
Чтобы решить эту проблему, вы должны установить положение вкладок с помощью определенной функции 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
и следующая форма будет отображаться
Теперь видно, что все значения правильно выровнены :-)
ВЫСТУПЛЕНИЯ
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);
}
}
}