我将要构建一个应用程序,需要捕获多个值并使用它们来生成文本:Name
,Age
等。
输出结果将是纯文本,显示在一个 TextBox
中。
我正在尝试让这些信息以一种类似于 列
的形式呈现,因此我正在尝试使用 制表符
将它们分开,以使其更清晰。
例如,不是像这样:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
Ann 26
Sarah 29
Paul 45
您有没有什么关于如何在文本中插入
标签的技巧?
我将要构建一个应用程序,需要捕获多个值并使用它们来生成文本:Name
,Age
等。
输出结果将是纯文本,显示在一个 TextBox
中。
我正在尝试让这些信息以一种类似于 列
的形式呈现,因此我正在尝试使用 制表符
将它们分开,以使其更清晰。
例如,不是像这样:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
Ann 26
Sarah 29
Paul 45
您有没有什么关于如何在文本中插入
标签的技巧?
尝试在您的字符串中使用\t
字符。
Hazar的\t
是正确的。以下是C#中所有转义字符的完整列表:
\'
代表单引号。
\"
代表双引号。
\\
代表反斜杠。
\0
代表空字符。
\a
代表警报字符。
\b
代表退格。
\f
代表换页符。
\n
代表换行符。
\r
代表回车符。
\t
代表水平制表符。
\v
代表垂直制表符。
\uxxxx
代表Unicode字符的十六进制值(例如\u0020
)。
\x
与\u
相同,但您不需要前导零(例如\x20
)。
\Uxxxxxxxx
代表Unicode字符的十六进制值(生成代理时需要使用较长的形式)。
使用String.Format
也很有用,例如:
String.Format("{0}\t{1}", FirstName,Count);
使用 Microsoft Winform 控件
,如果不进行一些小的变通操作,就无法正确地解决您的问题,下面我将解释这些操作。
问题
仅使用 "\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
值向右移动,与其他两个文本框的age
值不对齐。
解决方案
为了解决这个问题,您必须使用特定的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
以下表格将被显示:
您可以看到,现在所有的值都正确地对齐了 :-)
备注
必须将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);
}
}
}
var text = "Ann@26"
var editedText = text.Replace("@", "\t");
char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);
苹果:<tab>鲍勃
有几种方法可以实现。最简单的方法是在文本中使用\t
。然而,在某些情况下,如PdfReport
nuget包中,\t
可能无法正常工作。
\t
无法正常使用,添加关于如何添加选项卡的信息将非常有用。;) - J. Scott Elblein除了上面的答案,您还可以使用PadLeft或PadRight:
string name = "John";
string surname = "Smith";
Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;