web-dev-qa-db-fra.com

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

Je construis une application où je devrais capturer plusieurs valeurs et construire un texte avec elles: Name, Age, etc. 

La sortie sera un texte brut dans une TextBox.

J'essaie de faire en sorte que ces informations apparaissent sous la forme de columns, donc j'essaie de les séparer avec tab pour la rendre plus claire.

Par exemple, au lieu d'avoir:

Ann 26
Sarah 29
Paul 45

Je voudrais le montrer comme:

Ann tab 26 Sarah tab 29 Paul tab 45

Une astuce sur la façon de insert les onglets dans mon texte?

248
Layla

Essayez d'utiliser le caractère \t dans vos chaînes.

409
DShook

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

\' pour un seul devis.

\" pour une double citation.

\\ pour une barre oblique inverse.

\0 pour un caractère nul.

\a pour un caractère d'alerte.

\b pour un retour arrière.

\f pour un flux de formulaire.

\n pour une nouvelle ligne.

\r pour un retour de chariot.

\t pour un onglet horizontal.

\v pour un onglet vertical.

\uxxxx pour une valeur hexadécimale de caractère Unicode (par exemple, \u0020).

\x est identique à \u, mais vous n'avez pas besoin de zéros au début (par exemple \x20).

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

397
Dan R

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

String.Format("{0}\t{1}", FirstName,Count);
69
david valentine
var text = "Ann@26"

var editedText = text.Replace("@", "\t");
3
MafazR
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 mono-espacée.

2
CERI

Il y a plusieurs façons de le faire. Le plus simple utilise \t dans votre texte. Cependant, il est possible que \t ne fonctionne pas dans certaines situations, comme le package PdfReport nuget. 

2
Amin Saqi

En utilisant Microsoft Winform controls, il est impossible de résoudre correctement votre problème sans une solution de contournement que je vais expliquer ci-dessous.

PROBLÈME

Le problème en utilisant simplement "\t" ou vbTab est que, lorsque plusieurs TextBox sont affichés et que l'alignement doit être respecté pour tous les TextBox, la solution ONLY "\t" ou vbTab affichera quelque chose qui n'est PAS TOUJOURS correctement aligné.

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

 enter image description here

comme vous pouvez le constater, la valeur age de François-Victor est décalée vers la droite et n'est pas alignée sur la valeur age de deux autres TextBox.

SOLUTION

Pour résoudre ce problème, vous devez définir la position des onglets à l'aide d'une fonction API SendMessage() 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é

 enter image description here

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

REMARQUES

La propriété Multiline de la TextBox doit être définie sur True. Si cette propriété est définie sur False, l'onglet est positionné comme auparavant.

Comment la propriété AcceptsTab est attribuée n'est pas important (j'ai testé). 

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

Attention: l'unité de mesure pour la position de tabulation 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.

C # SOLUTION

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
schlebe

En plus des réponses ci-dessus, vous pouvez utiliser PadLeft et 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. 

0
Heersert

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);

Cela donnerait Apple:<tab>Bob

0
Hecatonchires