Chèn một ký tự tab vào văn bản bằng C #


283

Tôi đang xây dựng một ứng dụng mà tôi nên chụp nhiều giá trị và xây dựng một văn bản với họ: Name, Agevv

Đầu ra sẽ là một văn bản đơn giản thành một TextBox.

Tôi đang cố gắng làm cho những thông tin đó xuất hiện dưới dạng columns, vì vậy tôi đang cố tách chúng tabra để làm cho nó rõ ràng hơn.

Ví dụ: thay vì có:

Ann 26
Sarah 29
Paul 45

Tôi muốn nó hiển thị như:

Ann tab 26 Sarah tab 29 Paul tab 45

Bất kỳ mẹo về làm thế nào để insertcác tab vào văn bản của tôi?


Một lời cảnh báo ..... nếu độ dài của trường tên quá dài, bạn vẫn sẽ không khiến chúng căn chỉnh. "Ann" chỉ có 3 ký tự. "Jeremiah" là 8. Một tab duy nhất được thêm vào "Ann" có thể làm cho ## xuất hiện trước khi kết thúc jeremiah. Tôi sẽ đề nghị phân tích theo số lượng ký tự. "Tách" theo khoảng trắng, thêm khoảng trắng cho thành viên đầu tiên cho đến 12 ký tự và THEN thêm "26". Nếu bạn có tên có thể dài hơn 12, hãy điều chỉnh
KeachyPeenReturns

Tôi vừa đọc bình luận của KeachyPeenReturns sau khi đã đăng một giải pháp. Nhận xét của ông là đúng nhưng giải pháp của ông là không hoàn hảo. Câu trả lời TỐT NHẤT đã không chính xác. Vui lòng dành thời gian để đọc giải pháp của tôi và cập nhật trạng thái (câu trả lời TỐT NHẤT) cho câu hỏi này. Thông thường, tôi không đăng loại bình luận này nhưng câu hỏi rất cũ.
schlebe

Câu trả lời:


460

Hãy thử sử dụng \tký tự trong chuỗi của bạn


445

Hazar đúng với mình \t. Dưới đây là danh sách đầy đủ các ký tự thoát cho C #:

\' cho một trích dẫn duy nhất.

\" cho một trích dẫn kép.

\\ cho một dấu gạch chéo ngược.

\0 cho một ký tự null.

\a cho một nhân vật cảnh báo.

\b cho một khoảng lùi.

\f cho một hình thức thức ăn.

\n cho một dòng mới.

\r cho một sự trở lại vận chuyển.

\t cho một tab ngang.

\v cho một tab dọc.

\uxxxxcho một giá trị hex ký tự unicode (ví dụ \u0020).

\xgiống như \u, nhưng bạn không cần các số 0 đứng đầu (ví dụ \x20).

\Uxxxxxxxx đối với giá trị hex ký tự unicode (dạng dài hơn cần thiết để tạo thay thế).


8
Bạn đã tìm thấy dữ liệu này ở đâu? Tôi muốn biết để tham khảo của tôi.
Queue Hammer

@Queue Hammer rom Jon Skeet mình, có vẻ như ... devbloss.microsoft.com/csharpfaq/ Kẻ
Leonard AB

74

Nó cũng có thể hữu ích để sử dụng String.Format, ví dụ

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

17
Đây là câu trả lời tốt nhất vì mã nói dài hơn một lớp lót và giải thích dài.
Phil

4
var text = "Ann@26"

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

2

Có một số cách để làm điều đó. Đơn giản nhất là sử dụng \ttrong văn bản của bạn. Tuy nhiên, có thể \tnó không hoạt động trong một số trường hợp, như PdfReportgói nuget.


4
Sẽ rất hữu ích khi thêm thông tin về cách thêm tab trong trường hợp \tkhông hoạt động. ;)
J. Scott Elblein

2

Sử dụng Microsoft Winform controls, không thể giải quyết chính xác vấn đề của bạn mà không có một cách giải quyết nhỏ mà tôi sẽ giải thích dưới đây.

VẤN ĐỀ

Vấn đề trong việc sử dụng đơn giản "\t"hoặc vbTablà khi có nhiều hơn một TextBox được hiển thị và sự liên kết đó phải được tôn trọng đối với tất cả TextBox, CHỈ "\t"hoặc vbTabgiải pháp sẽ hiển thị một cái gì đó KHÔNG LUÔN được căn chỉnh chính xác.

Ví dụ trong 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

sẽ hiển thị

nhập mô tả hình ảnh ở đây

như bạn có thể thấy, agegiá trị cho François-Victorđược dịch chuyển sang phải và không được liên kết với agegiá trị của hai TextBox khác.

GIẢI PHÁP

Để giải quyết vấn đề này, bạn phải đặt vị trí Tab bằng cách sử dụng SendMessage()chức năng API user32.dll cụ thể như được hiển thị bên dưới.

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

và Mẫu sau sẽ được hiển thị

nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể thấy rằng tất cả các giá trị được căn chỉnh chính xác :-)

NHỚ

Multilinethuộc tính của TextBox phải được đặt thành True . Nếu thuộc tính này được đặt thành Sai, Tab được định vị như trước.

Làm thế nào AcceptsTabtài sản được chỉ định là không quan trọng (tôi đã thử nghiệm).

Câu hỏi này đã được xử lý trên StackOverflow

Thận trọng: Đơn vị mesure cho vị trí Tab không phải là ký tự mà là thứ dường như là 1/4 ký tự. Đó là lý do tại sao tôi nhân chiều dài với 4.

GIẢI PHÁP 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);
        }
    }
}

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

Điều này hoạt động tốt, nhưng bạn phải có một phông chữ đơn cách.


1

Khi sử dụng chuỗi ký tự (bắt đầu bằng @ "), điều này có thể dễ dàng hơn

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

Sẽ dẫn đến Apple:<tab>Bob


1

Ngoài các anwsers ở trên, bạn có thể sử dụng PadLeft hoặc PadRight:

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

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

Điều này sẽ điền vào chuỗi với khoảng trắng ở bên trái hoặc bên phải.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.