C # kullanarak metne sekme karakteri ekleme


283

Ben birkaç değerlerini yakalamak ve onlarla bir metin inşa etmeliyiz bir uygulama inşa ediyorum: Name, Agevb

Çıktı düz bir metin olarak a TextBox.

Bu bilgileri aynen ortaya columnskoymaya çalışıyorum, bu yüzden tabdaha net hale getirmek için onları ayırmaya çalışıyorum .

Örneğin:

Ann 26
Sarah 29
Paul 45

Bunu göstermek istiyorum:

Ann sekmesi 26 Sarah sekmesi 29 Paul sekmesi 45

insertSekmelerimin metnime nasıl ekleneceği konusunda herhangi bir ipucu var mı?


Uyarı kelimesi ..... Eğer isim alanının uzunluğu çok uzunsa, yine de hizalamalarını sağlayamazsınız. "Ann" sadece 3 karakterdir. "Yeremya" 8'dir. "Ann" e eklenen tek bir sekme ## 'yi jeremya'nın sonundan önce gösterebilir. Karakter sayısına göre ayrıştırmayı öneririm. Boşluğa göre "Böl", ilk karaktere 12 karaktere kadar boşluk ekleyin ve ardından "26" ekleyin. 12'den uzun olabilecek bir adınız varsa, ayarlayın
KeachyPeenRet döner 13

Sadece bir çözüm gönderdikten sonra KeachyPeenReturns yorumunu okudum. Söylemesi doğru ama çözümü kusurlu. EN İYİ cevap zaten yanlış. Lütfen çözümümü okumak ve bu soru için durumu (EN İYİ cevap) güncellemek için zaman ayırın. Normalde, bu tür bir yorum göndermem ama soru çok eski.
19'da schlebe

Yanıtlar:


460

\tDizelerinizdeki karakteri kullanmayı deneyin


445

Hazar onun haklı \t. İşte C # için kaçış karakterlerinin tam listesi:

\' tek bir teklif için.

\" çift ​​teklif için.

\\ ters eğik çizgi için.

\0 boş bir karakter için.

\a bir uyarı karakteri için.

\b geri almak için.

\f form beslemesi için.

\n yeni bir çizgi için.

\r taşıma iadesi için.

\t yatay sekme için.

\v dikey sekme için.

\uxxxxUnicode karakter onaltılık değeri için (ör. \u0020).

\xile aynıdır \u, ancak baştaki sıfırlara (ör. \x20) ihtiyacınız yoktur .

\Uxxxxxxxx bir unicode karakter onaltılık değeri için (suretler oluşturmak için daha uzun form gerekir).


8
Bu verileri nerede buldunuz? Referansım için bilmek istiyorum.
QueueHammer

@QueueHammer rom Jon Skeet'in kendisi, öyle görünüyor ki ... devblogs.microsoft.com/csharpfaq/…
Leonard AB

74

Ayrıca String.Format, örneğin;

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

17
Bu en iyi yanıttır çünkü kod birden fazla astardan ve uzun açıklamalardan bahsediyor.
Phil

4
var text = "Ann@26"

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

2

Bunu yapmanın birkaç yolu vardır. En basit olanı \tmetninizde kullanmaktır. Ancak, nuget paketi \tgibi bazı durumlarda PdfReportçalışmaz.


4
İşe \tyaramadığı durumlarda nasıl sekme ekleneceği hakkında bilgi eklemek yararlı olacaktır . ;)
J. Scott Elblein

2

Kullanarak Microsoft Winform controls, aşağıda açıklayacağım küçük bir çözüm olmadan sorununuzu doğru bir şekilde çözmek imkansızdır.

SORUN

Basit kullanımda "\t"veya vbTabbirden fazla TextBox görüntülendiğinde ve bu hizalamaya tüm TextBox, ONLY "\t"veyavbTab çözüm her zaman doğru hizalanmış DEĞİLDİR şey gösterecektir.

VB.Net'te örnek:

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

gösterecek

resim açıklamasını buraya girin

gördüğünüz gibi, agedeğeri François-Victorsağa kaydırılır ve agediğer iki TextBox değeriyle hizalanmaz .

ÇÖZÜM

Bu sorunu çözmek için, SendMessage()aşağıda gösterildiği gibi belirli bir user32.dll API işlevini kullanarak Sekmeler konumunu ayarlamanız gerekir .

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

ve aşağıdaki Form görüntülenecektir

resim açıklamasını buraya girin

Artık tüm değerlerin doğru hizalandığını görebilirsiniz :-)

UYARILAR

Multiline TextBox özelliği True olarak ayarlanması gerekir . Bu özellikler False olarak ayarlanırsa, Sekme önceki gibi konumlandırılır.

Nasıl AcceptsTabMülkün atandığı önemli değildir (test ettim).

Bu soru zaten tedavi edildi StackOverflow

Dikkat: Tab pozisyonu için mesure Unit karakter değil, karakterin 1 / 4'ü gibi görünen bir şeydir. Bu yüzden uzunluğu 4 ile çarpıyorum.

C # ÇÖZÜM

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;

Bu iyi çalışıyor, ancak tek aralıklı yazı tipine sahip olmalısınız.


1

Değişmez dizeler kullanırken (@ "ile başlayın) bu daha kolay olabilir

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

İle sonuçlanır Apple:<tab>Bob


1

Yukarıdaki anws'lara ek olarak PadLeft veya PadRight'ı kullanabilirsiniz:

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

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

Bu, dizeyi sol veya sağdaki boşluklarla dolduracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.