Einfügen eines Tabulatorzeichens in Text mit C #

283

Ich baue eine Anwendung , wo ich mehrere Werte und bauen einen Text mit ihnen erfassen sollte: Name, Ageusw.

Die Ausgabe ist ein einfacher Text in a TextBox.

Ich versuche, diese Informationen irgendwie erscheinen zu lassen columns, deshalb versuche ich, sie zu trennen tab, um sie klarer zu machen.

Zum Beispiel anstatt:

Ann 26
Sarah 29
Paul 45

Ich möchte, dass es Folgendes zeigt:

Ann Tab 26 Sarah Tab 29 Paul Tab 45

Irgendwelche Tipps, wie man insertdie Registerkarten in meinen Text einfügt?

Layla
quelle
Ein Wort der Warnung ..... Wenn die Länge des Namensfelds zu lang ist, werden Sie sie immer noch nicht zum Ausrichten bringen. "Ann" besteht nur aus 3 Zeichen. "Jeremiah" ist 8. Ein einzelner Tab, der zu "Ann" hinzugefügt wird, kann dazu führen, dass das ## vor dem Ende von Jeremiah angezeigt wird. Ich würde vorschlagen, nach Anzahl der Zeichen zu analysieren. "Durch Leerzeichen teilen", dem ersten Element Leerzeichen bis zu 12 Zeichen hinzufügen und DANN "26" hinzufügen. Wenn Sie einen Namen haben, der länger als 12 sein könnte, passen Sie an
KeachyPeenReturns
Ich habe gerade den Kommentar von KeachyPeenReturns gelesen, nachdem ich eine Lösung veröffentlicht habe. Seine Bemerkung ist richtig, aber seine Lösung ist unvollkommen. Die BESTE Antwort ist bereits falsch. Bitte nehmen Sie sich Zeit, um meine Lösung zu lesen und den Status (BESTE Antwort) für diese Frage zu aktualisieren. Normalerweise poste ich diese Art von Kommentar nicht, aber die Frage ist sehr alt.
Schlebe

Antworten:

460

Versuchen Sie, das \tZeichen in Ihren Zeichenfolgen zu verwenden

DShook
quelle
445

Hazar hat recht mit seinem \t. Hier ist die vollständige Liste der Escape-Zeichen für C #:

\' für ein einfaches Zitat.

\" für ein doppeltes Zitat.

\\ für einen Backslash.

\0 für ein Nullzeichen.

\a für einen Alarmcharakter.

\b für eine Rücktaste.

\f für einen Formularvorschub.

\n für eine neue Zeile.

\r für einen Wagenrücklauf.

\t für eine horizontale Registerkarte.

\v für eine vertikale Registerkarte.

\uxxxxfür einen Unicode-Hex-Wert (z \u0020. B. ).

\xist dasselbe wie \u, aber Sie benötigen keine führenden Nullen (z \x20. B. ).

\Uxxxxxxxx für einen Unicode-Zeichen-Hex-Wert (längere Form zum Generieren von Ersatzzeichen erforderlich).

Dan R.
quelle
8
Wo haben Sie diese Daten gefunden? Ich würde gerne als Referenz wissen.
QueueHammer
@QueueHammer von Jon Skeet selbst, wie es scheint ... devblogs.microsoft.com/csharpfaq/…
Leonard AB
74

Es kann auch nützlich sein String.Format, z

String.Format("{0}\t{1}", FirstName,Count);
David Valentine
quelle
17
Dies ist die beste Antwort, da Code länger als ein Liner spricht und lange Erklärungen enthält.
Phil
4
var text = "Ann@26"

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

Es gibt verschiedene Möglichkeiten, dies zu tun. Am einfachsten ist die Verwendung \tin Ihrem Text. Es ist jedoch möglich, dass \tdies in bestimmten Situationen nicht funktioniert, z. B. beim PdfReportNuget-Paket.

Amin Saqi
quelle
4
Es wäre nützlich, Informationen zum Hinzufügen einer Registerkarte hinzuzufügen, falls \tdies nicht funktioniert. ;)
J. Scott Elblein
2

Mit Microsoft Winform controlsist es unmöglich, Ihr Problem richtig zu lösen, ohne eine kleine Problemumgehung, die ich unten erläutern werde.

PROBLEM

Das Problem bei der einfachen Verwendung "\t"oder vbTabbesteht darin, dass, wenn mehr als eine TextBox angezeigt wird und diese Ausrichtung für alle TextBox eingehalten werden muss, die EINZIGE "\t"oder vbTabLösung etwas anzeigt, das NICHT IMMER korrekt ausgerichtet ist.

Beispiel in 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

wird angezeigt

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, wird der ageWert für François-Victornach rechts verschoben und nicht mit dem ageWert von zwei anderen Textfeldern ausgerichtet.

LÖSUNG

Um dieses Problem zu lösen, müssen Sie die Position der Registerkarten mithilfe einer bestimmten SendMessage()API-Funktion user32.dll festlegen (siehe unten).

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

Das folgende Formular wird angezeigt

Geben Sie hier die Bildbeschreibung ein

Sie können jetzt sehen, dass alle Werte korrekt ausgerichtet sind :-)

BEMERKUNGEN

MultilineDie Eigenschaft der TextBox muss auf True gesetzt sein . Wenn diese Eigenschaft auf False gesetzt ist, wird die Registerkarte wie zuvor positioniert.

Wie die AcceptsTabEigenschaft zugewiesen wird, ist nicht wichtig (ich habe getestet).

Diese Frage wurde bereits in StackOverflow behandelt

Achtung: Die Messeinheit für die Tabulatorposition ist kein Zeichen, sondern etwas, das 1/4 des Zeichens zu sein scheint. Deshalb multipliziere ich die Länge mit 4.

C # LÖSUNG

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

Dies funktioniert gut, aber Sie müssen eine Schriftart mit einem Abstand haben.

CERI
quelle
1

Bei Verwendung von Literalzeichenfolgen (beginnen Sie mit @ ") ist dies möglicherweise einfacher

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

Würde dazu führen Apple:<tab>Bob

Hecatonchires
quelle
1

Zusätzlich zu den obigen Antworten können Sie PadLeft oder PadRight verwenden:

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

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

Dadurch wird die Zeichenfolge mit Leerzeichen links oder rechts gefüllt.

Heersert
quelle