提问人:Layla 提问时间:12/14/2008 最后编辑:schlebeLayla 更新时间:2/4/2023 访问量:722007
使用 C 在文本中插入制表符#
Inserting a tab character into text using C#
问:
我正在构建一个应用程序,我应该在其中捕获几个值并使用它们构建文本:、 等。Name
Age
输出将是纯文本转换为 .TextBox
我试图使这些信息以某种方式出现,因此我试图将它们分开以使其更清晰。columns
tab
例如,而不是具有:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
Ann 26
Sarah 29
Paul 45
关于如何将标签放入我的文本中的任何提示?insert
答:
尝试在字符串中使用该字符\t
哈扎尔对他的.下面是 C# 转义字符的完整列表:\t
\'
对于单个报价。
\"
用于双引号。
\\
用于反斜杠。
\0
对于 null 字符。
\a
用于警报字符。
\b
对于退格键。
\f
用于表单源。
\n
换行。
\r
用于回车。
\t
对于水平选项卡。
\v
对于垂直选项卡。
\uxxxx
对于 Unicode 字符十六进制值(例如 )。\u0020
\x
与 相同,但不需要前导零(例如 )。\u
\x20
\Uxxxxxxxx
对于 Unicode 字符十六进制值(生成代理项需要更长的格式)。
评论
它也可以用于使用,例如String.Format
String.Format("{0}\t{1}", FirstName,Count);
评论
有几种方法可以做到这一点。最简单的方法是在文本中使用。但是,在某些情况下可能不起作用,例如 nuget 包。\t
\t
PdfReport
评论
\t
var text = "Ann@26"
var editedText = text.Replace("@", "\t");
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
除了上面的 anwser 之外,您还可以使用 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 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
将显示
如您所见,值 for 向右移动,并且与另外两个 TextBox 的值不对齐。age
François-Victor
age
溶液
要解决此问题,您必须使用特定的 user32.dll API 函数设置选项卡位置,如下所示。SendMessage()
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,则 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);
}
}
}
评论