Za pomocą Microsoft Winform controls
nie można poprawnie rozwiązać problemu bez małego obejścia, które wyjaśnię poniżej.
PROBLEM
Problem z prostym użyciem "\t"
lub vbTab
polega na tym, że gdy wyświetla się więcej niż jeden TextBox i że wyrównanie musi być przestrzegane dla wszystkich TextBox, TYLKO "\t"
lub vbTab
rozwiązanie wyświetli coś, co NIE ZAWSZE jest poprawnie wyrównane.
Przykład w 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
wyświetli się
jak widać, age
wartość for François-Victor
jest przesunięta w prawo i nie jest wyrównana z age
wartością dwóch innych TextBox.
ROZWIĄZANIE
Aby rozwiązać ten problem, należy ustawić pozycję Tabs przy użyciu określonej SendMessage()
funkcji API user32.dll, jak pokazano poniżej.
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
i wyświetlony zostanie następujący formularz
Teraz widać, że wszystkie wartości są poprawnie wyrównane :-)
UWAGI
Multiline
Właściwość TextBox musi być ustawiona na True . Jeśli ta właściwość jest ustawiona na False, karta jest pozycjonowana jak poprzednio.
Sposób AcceptsTab
przypisania własności nie jest ważny (przetestowałem).
To pytanie zostało już potraktowane na StackOverflow
Uwaga: jednostka miary dla pozycji Tab nie jest znakiem, ale czymś, co wydaje się mieć 1/4 znaku. Dlatego mnożę długość przez 4.
C # ROZWIĄZANIE
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);
}
}
}