【问题标题】:Inserting a tab character into text using C#使用 C# 在文本中插入制表符
【发布时间】:2010-09-26 20:07:20
【问题描述】:

我正在构建一个应用程序,我应该在其中捕获多个值并使用它们构建文本:NameAge 等。

输出将是纯文本到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 的评论。他的话是正确的,但他的解决方案并不完美。最佳答案已经不正确。请花时间阅读我的解决方案并更新此问题的状态(最佳答案)。通常情况下,我不会发布此类评论,但问题已经很老了。

标签: c# .net


【解决方案1】:

尝试在字符串中使用\t 字符

【讨论】:

    【解决方案2】:

    Hazar 的\t 是正确的。以下是 C# 转义字符的完整列表:

    \' 用于单引号。

    \" 用于双引号。

    \\ 表示反斜杠。

    \0 为空字符。

    \a 表示警报字符。

    \b 用于退格。

    \f 用于换页。

    \n 换行。

    \r 用于回车。

    \t 用于水平标签。

    \v 用于垂直制表符。

    \uxxxx 用于 Unicode 字符十六进制值(例如 \u0020)。

    \x\u 相同,但不需要前导零(例如 \x20)。

    \Uxxxxxxxx 用于 unicode 字符十六进制值(生成代理项需要更长的形式)。

    【讨论】:

    【解决方案3】:

    使用String.Format 也很有用,例如

    String.Format("{0}\t{1}", 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-Victorage 值向右移动,并且与另外两个 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 属性如何分配并不重要(我已经测试过)。

      这个问题已经在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);
              }
          }
      }
      

      【讨论】:

        【解决方案6】:

        有几种方法可以做到这一点。最简单的方法是在您的文本中使用\t。但是,\t 在某些情况下可能不起作用,例如PdfReport nuget 包。

        【讨论】:

        • \t 不起作用的情况下,添加有关如何添加选项卡的信息会很有用。 ;)
        【解决方案7】:

        如果使用文字字符串(以 @" 开头),这可能会更容易

        char tab = '\u0009';
        string A = "Apple";
        string B = "Bob";
        string myStr = String.Format(@"{0}:{1}{2}", 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));
            

            这将用左边或右边的空格填充字符串。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-04-05
              • 1970-01-01
              • 1970-01-01
              • 2022-08-16
              • 1970-01-01
              • 2012-10-20
              • 2013-06-20
              相关资源
              最近更新 更多