Insertion d'un caractère de tabulation dans du texte à l'aide de C #

284

Je construis une application où je saisir plusieurs valeurs et construire un texte avec eux Name, Ageetc.

La sortie sera un texte brut dans un fichier TextBox.

J'essaie de faire apparaître ces informations sous forme de columns, donc j'essaie de les séparer avec tabpour le rendre plus clair.

Par exemple, au lieu d'avoir:

Ann 26
Sarah 29
Paul 45

Je voudrais qu'il se présente comme:

Ann onglet 26 Sarah onglet 29 Paul onglet 45

Une astuce sur la façon dont insertles onglets dans mon texte?

Layla
la source
Un mot d'avertissement ..... si la longueur du champ de nom est trop longue, vous ne pourrez toujours pas les aligner. "Ann" ne compte que 3 caractères. "Jeremiah" est 8. Un seul onglet ajouté à "Ann" pourrait faire apparaître le ## avant la fin de jeremiah. Je suggère d'analyser par nombre de caractères. "Fractionner" par espace, ajouter des espaces au premier membre jusqu'à 12 caractères, puis ajouter "26". Si vous avez un nom qui peut être plus long que 12, ajustez
KeachyPeenReturns
Je viens de lire le commentaire de KeachyPeenReturns après avoir posté une solution. Sa remarque est correcte mais sa solution est imparfaite. La MEILLEURE réponse est déjà incorrecte. Veuillez prendre le temps de lire ma solution et de mettre à jour le statut (MEILLEURE réponse) pour cette question. Normalement, je ne poste pas ce type de commentaire mais la question est très ancienne.
schlebe

Réponses:

461

Essayez d'utiliser le \tcaractère dans vos chaînes

DShook
la source
445

Hazar a raison avec le sien \t. Voici la liste complète des caractères d'échappement pour C #:

\' pour un devis unique.

\" pour un double devis.

\\ pour une barre oblique inverse.

\0 pour un caractère nul.

\a pour un caractère alerte.

\b pour un retour arrière.

\f pour un flux de formulaire.

\n pour une nouvelle ligne.

\r pour un retour chariot.

\t pour un onglet horizontal.

\v pour un onglet vertical.

\uxxxxpour une valeur hexadécimale de caractère unicode (par exemple \u0020).

\xest identique à \u, mais vous n'avez pas besoin de zéros non significatifs (par exemple \x20).

\Uxxxxxxxx pour une valeur hexadécimale de caractère unicode (forme plus longue nécessaire pour générer des substituts).

Dan R
la source
8
Où avez-vous trouvé ces données? Je voudrais savoir pour ma référence.
QueueHammer
@QueueHammer rom Jon Skeet lui-même, il semble ... devblogs.microsoft.com/csharpfaq/…
Leonard AB
74

Il peut également être utile d'utiliser String.Format, par exemple

String.Format("{0}\t{1}", FirstName,Count);
david valentine
la source
17
C'est la meilleure réponse car le code parle plus d'une ligne et de longues explications.
Phil
4
var text = "Ann@26"

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

Il y a plusieurs façons de procéder. Le plus simple est d'utiliser \tdans votre texte. Cependant, il est possible que \tcela ne fonctionne pas dans certaines situations, comme le PdfReportpackage nuget.

Amin Saqi
la source
4
Il serait utile d'ajouter des informations sur la façon d'ajouter un onglet dans le cas où \tcela ne fonctionne pas. ;)
J. Scott Elblein
2

En utilisant Microsoft Winform controls, il est impossible de résoudre correctement votre problème sans une petite solution que j'expliquerai ci-dessous.

PROBLÈME

Le problème de l'utilisation simple "\t"ou vbTabest que lorsque plusieurs TextBox sont affichés et que l'alignement doit être respecté pour tous les TextBox, la SEULE "\t"ou la vbTabsolution affichera quelque chose qui n'est PAS TOUJOURS correctement aligné.

Exemple dans 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

Affichera

entrez la description de l'image ici

comme vous pouvez le voir, la agevaleur de François-Victorest décalée vers la droite et n'est pas alignée avec la agevaleur de deux autres TextBox.

SOLUTION

Pour résoudre ce problème, vous devez définir la position des onglets à l'aide d'une SendMessage()fonction API user32.dll spécifique , comme indiqué ci-dessous.

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

et le formulaire suivant sera affiché

entrez la description de l'image ici

Vous pouvez voir que maintenant, toutes les valeurs sont correctement alignées :-)

REMARQUES

MultilineLa propriété de TextBox doit être définie sur True . Si ces propriétés sont définies sur False, l'onglet est positionné comme précédemment.

La façon dont la AcceptsTabpropriété est attribuée n'est pas importante (j'ai testé).

Cette question a déjà été traitée sur StackOverflow

Attention: l'unité de mesure pour la position Tab n'est pas un caractère mais quelque chose qui semble être 1/4 de caractère. C'est pourquoi je multiplie la longueur par 4.

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

Cela fonctionne bien, mais vous devez avoir une police à espacement mono.

CERI
la source
1

Lorsque vous utilisez des chaînes littérales (commencez par @ "), cela pourrait être plus facile

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

Résulterait en Apple:<tab>Bob

Hecatonchires
la source
1

En plus des réponses ci-dessus, vous pouvez utiliser PadLeft ou PadRight:

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

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

Cela remplira la chaîne avec des espaces à gauche ou à droite.

Heersert
la source