Memasukkan karakter tab ke dalam teks menggunakan C #

283

Aku sedang membangun sebuah aplikasi di mana saya harus menangkap beberapa nilai-nilai dan membangun sebuah teks dengan mereka: Name, Age, dll

Outputnya akan berupa teks biasa menjadi a TextBox.

Saya mencoba untuk membuat informasi tersebut muncul dalam bentuk columns, oleh karena itu saya mencoba untuk memisahkan mereka dengan tabmembuatnya lebih jelas.

Misalnya, alih-alih memiliki:

Ann 26
Sarah 29
Paul 45

Saya ingin ditampilkan sebagai:

Ann tab 26 Sarah tab 29 Paul tab 45

Adakah tip tentang cara insertmembuka tab pada teks saya?

Layla
sumber
Sebuah kata peringatan ..... jika panjang bidang nama terlalu panjang, Anda masih tidak akan bisa menyelaraskannya. "Ann" hanya 3 karakter. "Yeremia" adalah 8. Satu tab yang ditambahkan ke "Ann" mungkin membuat ## muncul sebelum akhir Yeremia. Saya akan menyarankan parsing berdasarkan jumlah karakter. "Split" dengan spasi, tambahkan spasi ke anggota pertama hingga 12 karakter, dan MAKA tambahkan "26". Jika Anda memiliki nama yang mungkin lebih dari 12, sesuaikan
KeachyPeenReturns
Saya baru saja membaca komentar KeachyPeenReturns setelah memposting solusi. Komentarnya benar tetapi solusinya tidak sempurna. Jawaban TERBAIK sudah salah. Luangkan waktu untuk membaca solusi saya dan memperbarui status (jawaban TERBAIK) untuk pertanyaan ini. Biasanya, saya tidak memposting jenis komentar ini tetapi pertanyaannya sudah sangat lama.
schlebe

Jawaban:

460

Coba gunakan \tkarakter di string Anda

DShook
sumber
445

Hazar benar dengan miliknya \t. Berikut daftar lengkap karakter pelarian untuk C #:

\' untuk satu kutipan.

\" untuk kutipan ganda.

\\ untuk backslash.

\0 untuk karakter nol.

\a untuk karakter lansiran.

\b untuk backspace.

\f untuk umpan formulir.

\n untuk jalur baru.

\r untuk pengembalian kereta.

\t untuk tab horizontal.

\v untuk tab vertikal.

\uxxxxuntuk nilai hex karakter unicode (misalnya \u0020).

\xsama dengan \u, tetapi Anda tidak perlu memimpin nol (mis \x20.).

\Uxxxxxxxx untuk nilai hex karakter unicode (diperlukan bentuk yang lebih panjang untuk menghasilkan pengganti).

Dan R
sumber
8
Di mana Anda menemukan data ini? Saya ingin tahu untuk referensi saya.
QueueHammer
@QueueHammer rom Jon Skeet sendiri, sepertinya ... devblogs.microsoft.com/csharpfaq/…
Leonard AB
74

Ini juga dapat berguna untuk digunakan String.Format, misalnya

String.Format("{0}\t{1}", FirstName,Count);
david valentine
sumber
17
Ini adalah jawaban terbaik karena kode berbicara lebih dari satu liner dan penjelasan panjang.
Phil
4
var text = "Ann@26"

var editedText = text.Replace("@", "\t");
MafazR
sumber
2

Ada beberapa cara untuk melakukannya. Yang paling sederhana adalah menggunakan \tteks Anda. Namun, mungkin itu \ttidak berfungsi dalam beberapa situasi, seperti PdfReportpaket nuget.

Amin Saqi
sumber
4
Akan bermanfaat untuk menambahkan info tentang cara menambahkan tab dalam kasus di mana \ttidak berfungsi. ;)
J. Scott Elblein
2

Menggunakan Microsoft Winform controls, tidak mungkin untuk menyelesaikan masalah Anda dengan benar tanpa sedikit solusi yang akan saya jelaskan di bawah ini.

MASALAH

Masalah dalam menggunakan secara sederhana "\t"atau vbTabadalah bahwa ketika lebih dari satu TextBox ditampilkan dan penyelarasan itu harus dihormati untuk semua TextBox, HANYA "\t"atau vbTabsolusi akan menampilkan sesuatu yang TIDAK SELALU selaras dengan benar.

Contoh di 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

akan ditampilkan

masukkan deskripsi gambar di sini

seperti yang Anda lihat, agenilai untuk François-Victorbergeser ke kanan dan tidak selaras dengan agenilai dua TextBox lainnya.

LARUTAN

Untuk mengatasi masalah ini, Anda harus mengatur posisi Tab menggunakan SendMessage()fungsi API user32.dll tertentu seperti yang ditunjukkan di bawah ini.

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

dan Formulir berikut akan ditampilkan

masukkan deskripsi gambar di sini

Anda dapat melihat bahwa sekarang, semua nilai disejajarkan dengan benar :-)

CATATAN

Multilineproperti TextBox harus disetel ke True . Jika properti ini disetel ke False, Tab diposisikan seperti sebelumnya.

Bagaimana AcceptsTabproperti ditugaskan tidak penting (saya telah menguji).

Pertanyaan ini sudah ditangani di StackOverflow

Perhatian: Unit mesure untuk posisi Tab bukan karakter tetapi sesuatu yang tampaknya 1/4 karakter. Itu sebabnya saya kalikan panjangnya dengan 4.

C # SOLUSI

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);
        }
    }
}
schlebe
sumber
1
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

Ini berfungsi dengan baik, tetapi Anda harus memiliki font satu spasi.

CERI
sumber
1

Saat menggunakan string literal (mulai dengan @ ") ini mungkin lebih mudah

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

Akan menghasilkan Apple:<tab>Bob

Hecatonchires
sumber
1

Selain jawaban di atas, Anda dapat menggunakan PadLeft atau PadRight:

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

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

Ini akan mengisi string dengan spasi ke kiri atau kanan.

Heersert
sumber