การแทรกอักขระแท็บเป็นข้อความโดยใช้ C #


283

ฉันกำลังสร้างแอพลิเคชันที่ฉันควรจะจับหลายค่าและสร้างข้อความกับพวกเขา: Name, Ageฯลฯ

TextBoxการส่งออกจะเป็นข้อความธรรมดาเป็น

ฉันพยายามทำให้ข้อมูลเหล่านั้นปรากฏในลักษณะcolumnsดังนั้นฉันจึงพยายามแยกข้อมูลเหล่านั้นออกtabเพื่อทำให้ชัดเจนขึ้น

ตัวอย่างเช่นแทนที่จะมี:

Ann 26
Sarah 29
Paul 45

ฉันต้องการให้มันแสดงเป็น:

Ann tab 26 Sarah tab 29 Paul Tab 45

มีเคล็ดลับเกี่ยวกับinsertแท็บต่างๆในข้อความของฉันอย่างไร?


คำเตือน ..... หากความยาวของฟิลด์ชื่อยาวเกินไปคุณจะไม่สามารถจัดแนวเหล่านั้นได้ "Ann" มีเพียง 3 ตัวอักษร "Jeremiah" คือ 8 แท็บเดียวที่เพิ่มใน "Ann" อาจทำให้ ## ปรากฏขึ้นก่อนที่จะสิ้นสุด jeremiah ฉันจะแนะนำให้แยกตามจำนวนตัวอักษร "แยก" ด้วยช่องว่างเพิ่มช่องว่างให้กับสมาชิกคนแรกจนถึง 12 ตัวอักษรแล้วเพิ่ม "26" หากคุณมีชื่อที่อาจยาวกว่า 12 ให้ปรับ
KeachyPeenReturns

ฉันเพิ่งอ่านความคิดเห็นของ KeachyPeenReturns หลังจากโพสต์โซลูชันแล้ว คำพูดของเขาถูกต้อง แต่คำตอบของเขาไม่สมบูรณ์ คำตอบที่ดีที่สุดไม่ถูกต้องแล้ว โปรดสละเวลาอ่านวิธีแก้ปัญหาและอัพเดทสถานะ (คำตอบที่ดีที่สุด) สำหรับคำถามนี้ โดยปกติฉันจะไม่โพสต์ความคิดเห็นประเภทนี้ แต่คำถามนั้นเก่ามาก
schlebe

คำตอบ:



445

\tฮาซาเป็นสิทธิของเขา นี่คือรายการอักขระการหลีกเลี่ยงทั้งหมดสำหรับ C #:

\' สำหรับคำพูดเดียว

\" สำหรับคำพูดสองครั้ง

\\ สำหรับแบ็กสแลช

\0 สำหรับอักขระ null

\a สำหรับตัวอักษรแจ้งเตือน

\b สำหรับ backspace

\f สำหรับฟีดฟอร์ม

\n สำหรับบรรทัดใหม่

\r สำหรับการรับคืน

\t สำหรับแท็บแนวนอน

\v สำหรับแท็บแนวตั้ง

\uxxxxสำหรับค่าเลขฐานสิบหกของอักขระ Unicode (เช่น\u0020)

\xเหมือนกัน\uแต่คุณไม่ต้องการเลขศูนย์นำหน้า (เช่น\x20)

\Uxxxxxxxx สำหรับค่าเลขฐานสิบหกอักขระ Unicode (แบบฟอร์มอีกต่อไปที่จำเป็นสำหรับการสร้างตัวแทน)


8
คุณพบข้อมูลนี้ที่ไหน ฉันต้องการทราบสำหรับการอ้างอิงของฉัน
QueueHammer

@QueueHammer rom Jon Skeet ตัวเองดูเหมือนว่า ... devblogs.microsoft.com/csharpfaq/…
Leonard AB

74

มันยังมีประโยชน์ในการใช้String.Formatเช่น

String.Format("{0}\t{1}", FirstName,Count);

17
นี่คือคำตอบที่ดีที่สุดเพราะโค้ดพูดยาวกว่าหนึ่ง liners และคำอธิบายที่ยาว
ฟิล


2

มีหลายวิธีที่จะทำ วิธีที่ง่ายที่สุดคือใช้\tในข้อความของคุณ อย่างไรก็ตามเป็นไปได้ที่\tจะไม่ทำงานในบางสถานการณ์เช่นPdfReportแพคเกจ nuget


4
มันจะมีประโยชน์ในการเพิ่มข้อมูลเกี่ยวกับวิธีเพิ่มแท็บในกรณีที่\tใช้งานไม่ได้ ;)
J. Scott Elblein

2

การใช้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

จะแสดง

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นageค่าสำหรับFrançois-Victorเลื่อนไปทางขวาและไม่สอดคล้องกับ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

และแบบฟอร์มต่อไปนี้จะปรากฏขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเห็นได้ว่าตอนนี้ค่าทั้งหมดอยู่ในแนวเดียวกัน :-)

หมายเหตุ

Multilineคุณสมบัติของกล่องข้อความจะต้องตั้งค่าที่แท้จริง หากคุณสมบัตินี้ถูกตั้งค่าเป็นเท็จแท็บจะถูกจัดตำแหน่งเหมือนเดิม

วิธีการAcceptsTabกำหนดคุณสมบัติไม่สำคัญ (ฉันได้ทดสอบ)

คำถามนี้ได้รับการปฏิบัติกับStackOverflow แล้ว

ข้อควรระวัง: หน่วย mesure สำหรับตำแหน่งแท็บไม่ใช่อักขระ แต่เป็นสิ่งที่น่าจะเป็น 1/4 ของอักขระ นั่นคือสาเหตุที่ฉันคูณความยาวด้วย 4

C # SOLUTION

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);
        }
    }
}

1
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

วิธีนี้ใช้งานได้ดี แต่คุณต้องมีแบบอักษรขาวดำ


1

เมื่อใช้สตริงตัวอักษร (เริ่มต้นด้วย @ ") สิ่งนี้อาจจะง่ายกว่า

char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);

จะส่งผลให้ Apple:<tab>Bob


1

นอกเหนือจากผู้ใช้งานด้านบนคุณสามารถใช้ PadLeft หรือ PadRight:

string name = "John";
string surname = "Smith";

Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));

นี้จะกรอกข้อมูลในสตริงที่มีช่องว่างไปทางซ้ายหรือขวา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.