使用 C# 在文本中插入制表符
Posted
技术标签:
【中文标题】使用 C# 在文本中插入制表符【英文标题】:Inserting a tab character into text using C# 【发布时间】:2010-09-26 20:07:20 【问题描述】:我正在构建一个应用程序,我应该在其中捕获多个值并使用它们构建文本:Name
、Age
等。
输出将是纯文本到TextBox
。
我试图让这些信息以columns
的形式出现,因此我试图将它们与tab
分开以使其更清晰。
例如,而不是:
Ann 26
Sarah 29
Paul 45
我希望它显示为:
安 tab 26 莎拉 tab 29 保罗 tab 45
关于如何在我的文本中insert
选项卡的任何提示?
【问题讨论】:
一句警告.....如果名称字段的长度太长,您仍然无法让它们对齐。 “安”只有3个字。 “Jeremiah”是 8。添加到“Ann”的单个选项卡可能会使 ## 出现在 jeremiah 的结尾之前。我建议按字符数进行解析。按空格“拆分”,将空格添加到第一个成员直到 12 个字符,然后添加“26”。如果您的名称可能超过 12,请调整 我刚刚在发布解决方案后阅读了 KeachyPeenReturns 的评论。他的话是正确的,但他的解决方案并不完美。最佳答案已经不正确。请花时间阅读我的解决方案并更新此问题的状态(最佳答案)。通常情况下,我不会发布此类评论,但问题已经很老了。 【参考方案1】:尝试在字符串中使用\t
字符
【讨论】:
【参考方案2】:Hazar 的\t
是正确的。以下是 C# 转义字符的完整列表:
\'
用于单引号。
\"
用于双引号。
\\
表示反斜杠。
\0
为空字符。
\a
表示警报字符。
\b
用于退格。
\f
用于换页。
\n
换行。
\r
用于回车。
\t
用于水平标签。
\v
用于垂直制表符。
\uxxxx
用于 Unicode 字符十六进制值(例如 \u0020
)。
\x
与 \u
相同,但不需要前导零(例如 \x20
)。
\Uxxxxxxxx
用于 unicode 字符十六进制值(生成代理项需要更长的形式)。
【讨论】:
您在哪里找到这些数据?我想知道以供参考。 @QueueHammer rom Jon Skeet 本人,看来...devblogs.microsoft.com/csharpfaq/…【参考方案3】:使用String.Format
也很有用,例如
String.Format("0\t1", FirstName,Count);
【讨论】:
这是最好的答案,因为代码比一个衬里和长解释要长。【参考方案4】:var text = "Ann@26"
var editedText = text.Replace("@", "\t");
【讨论】:
【参考方案5】:使用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
会显示
如您所见,François-Victor
的 age
值向右移动,并且与另外两个 TextBox 的 age
值不对齐。
解决方案
要解决这个问题,您必须使用特定的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
会显示以下表格
您现在可以看到,所有值都已正确对齐:-)
备注
TextBox 的Multiline
属性必须设置为True。如果此属性设置为 False,则 Tab 的位置与以前一样。
AcceptsTab
属性如何分配并不重要(我已经测试过)。
这个问题已经在***处理过
注意: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);
【讨论】:
【参考方案6】:有几种方法可以做到这一点。最简单的方法是在您的文本中使用\t
。但是,\t
在某些情况下可能不起作用,例如PdfReport
nuget 包。
【讨论】:
在\t
不起作用的情况下,添加有关如何添加选项卡的信息会很有用。 ;)【参考方案7】:
如果使用文字字符串(以 @" 开头),这可能会更容易
char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"0:12", A, tab, B);
将导致Apple:<tab>Bob
【讨论】:
【参考方案8】:string St = String.Format("0,-20 1,5:N1\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;
这很好用,但您必须使用等距字体。
【讨论】:
【参考方案9】:除了上面的答案之外,您还可以使用 PadLeft 或 PadRight:
string name = "John";
string surname = "Smith";
Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));
这将用左边或右边的空格填充字符串。
【讨论】:
以上是关于使用 C# 在文本中插入制表符的主要内容,如果未能解决你的问题,请参考以下文章