我正在构建一个应用程序,我应该捕获几个值并使用它们构建一个文本:姓名、年龄等。
输出将是一个纯文本到一个文本框。
我试图使这些信息出现在一种列,因此我试图用tab分开它们,使它更清楚。
例如,不要有:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
Ann 26
Sarah 29
Paul 45
任何提示如何插入标签到我的文本?
我正在构建一个应用程序,我应该捕获几个值并使用它们构建一个文本:姓名、年龄等。
输出将是一个纯文本到一个文本框。
我试图使这些信息出现在一种列,因此我试图用tab分开它们,使它更清楚。
例如,不要有:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
Ann 26
Sarah 29
Paul 45
任何提示如何插入标签到我的文本?
哈扎尔是对的。下面是c#中转义字符的完整列表:
\'表示一个单引号。
作为双引号。
\\表示反斜杠。
\0表示空字符。
\a表示警告字符。
\b表示退格。
\f表示表单提要。
\n为一个新的行。
\r表示马车返回。
\t用于水平制表符。
\v表示垂直制表符。
\uxxxx表示unicode字符十六进制值(例如\u0020)。
\x和\u是一样的,但是你不需要前导零(例如\x20)。
\Uxxxxxxxx表示unicode字符十六进制值(生成代理时需要较长的格式)。
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;
这很好,但你必须有一个单一行距字体。
当使用文字字符串(以@"开头)时,这可能更容易
char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);
将导致Apple:<tab>Bob
除了上面的答案,你可以使用PadLeft或PadRight:
string name = "John";
string surname = "Smith";
Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));
这将在字符串中向左或向右填充空格。
使用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的年龄值被移到了右边,并没有与其他两个文本框的年龄值对齐。
解决方案
要解决这个问题,必须使用特定的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
和以下表格将显示
现在你可以看到,所有的值都正确对齐了:-)
讲话
文本框的多行属性必须设置为True。如果此属性设置为False,则Tab的位置与之前相同。
如何分配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);
}
}
}