使用Microsoft Winform controls,如果没有我将在下面解释的小变通方法,就不可能正确解决您的问题。
问题
仅使用"\t" 或vbTab 的问题在于,当显示多个文本框并且所有文本框都必须遵守对齐方式时,唯一的"\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
会显示
如您所见,François-Victor 的 age 值向右移动,并且与另外两个 TextBox 的 age 值不对齐。
解决方案
要解决这个问题,您必须使用特定的SendMessage() user32.dll API 函数来设置 Tabs 位置,如下所示。
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 的Multiline 属性必须设置为True。如果此属性设置为 False,则 Tab 的位置与以前一样。
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);
}
}
}