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?
Essayez d'utiliser le caractère \t
dans vos chaînes.
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).
Il peut également être utile d’utiliser String.Format
, par exemple.
String.Format("{0}\t{1}", FirstName,Count);
var text = "Ann@26"
var editedText = text.Replace("@", "\t");
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.
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.
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
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é
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);
}
}
}
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.
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