我建立一个应用程序,我应该抓住几个值,并与他们建立良好的文字:Name
,Age
等等。
输出将是纯文本格式TextBox
。
我试图使这些信息以某种形式出现columns
,因此我试图将它们分开tab
以使其更加清晰。
例如,与其具有:
Ann 26
Sarah 29
Paul 45
我希望显示为:
Ann 标签页 26 Sarah 标签页 29 Paul 标签页 45
关于如何insert
将选项卡插入文本的任何提示?
我建立一个应用程序,我应该抓住几个值,并与他们建立良好的文字:Name
,Age
等等。
输出将是纯文本格式TextBox
。
我试图使这些信息以某种形式出现columns
,因此我试图将它们分开tab
以使其更加清晰。
例如,与其具有:
Ann 26
Sarah 29
Paul 45
我希望显示为:
Ann 标签页 26 Sarah 标签页 29 Paul 标签页 45
关于如何insert
将选项卡插入文本的任何提示?
Answers:
哈扎尔是对的\t
。这是C#的转义字符的完整列表:
\'
单引号。
\"
双引号。
\\
反斜杠。
\0
为空字符。
\a
警报字符。
\b
退格。
\f
用于换页。
\n
换一行。
\r
回车。
\t
用于水平制表符。
\v
用于垂直标签。
\uxxxx
用于unicode字符的十六进制值(例如\u0020
)。
\x
与相同\u
,但是您不需要前导零(例如\x20
)。
\Uxxxxxxxx
对于unicode字符的十六进制值(生成替代项需要更长的形式)。
有几种方法可以做到这一点。最简单的是\t
在您的文本中使用。但是,\t
在某些情况下(如PdfReport
nuget包)可能无法正常工作。
\t
不起作用的情况下添加有关如何添加选项卡的信息将很有用。;)
使用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
将显示
如您所见,age
for的值François-Victor
向右移动,并且与age
其他两个TextBox的值不对齐。
解
要解决此问题,您必须使用特定的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
并显示以下表格
您现在可以看到,所有值都已正确对齐:-)
备考
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);
}
}
}