Використовуючи 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);
}
}
}