を使用してMicrosoft Winform controls
、以下で説明する少しの回避策なしに問題を正しく解決することは不可能です。
問題
単に"\t"
またはを使用vbTab
する際の問題は、複数のTextBoxが表示され、その配置がすべてのTextBoxで尊重される必要がある場合、ONLY "\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
他の2つのTextBoxの値と整列していません。
解決
この問題を解決するには、SendMessage()
以下に示すように、特定のuser32.dll API関数を使用してタブの位置を設定する必要があります。
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ですでに扱われています
注意:タブ位置の測定単位は文字ではなく、文字の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);
}
}
}