2009-05-31 7 views
3

J'ai un petit problème stupide et j'espérais que vous pourriez vous joindre à votre expérience.Comment bien aligner du texte dans une zone de texte et le conserver lors de l'exportation au format .txt

je besoin d'une zone de texte avec les données (dynamique) suivant:

TEXT  
TEXT 
TEXT 
TEXT 

_______________________ 
Name:   Amount: 
Blah     3 
Blahblah    10 
_______________________ 

Mais le texte à l'intérieur de la boîte est la question. Jusqu'à présent, je fais tout ce texte avec un StringBuilder appelé SB et à la fin j'ai mis MyTextBox.Text = SB.ToString();

Je mis l'en-tête dans la boîte comme ceci:

SB.AppendLine("Name\t\Amount:"); 

je produis les données dans une boucle comme ceci:

SB.AppendLine(name + "\t\t" + amount); 

Mais il n'aligne pas exactement comme mon exemple! Si le nom est plus long que le nom précédent, le montant apparaîtra à un endroit différent sur la ligne - par rapport au précédent.

Fx. comme ceci:

TEXT 
TEXT 
TEXT 
TEXT 

__________________ 
Navn  Antal: 
SpecSaver   1 
MadEyes  1 
Gucci  1 
__________________ 

Mon premier problème: Comment puis-je empêcher cela? Que faites-vous habituellement lorsque vous avez besoin d'une zone de texte multiligne pour contenir beaucoup de données. Mon second problème: Quand je l'exporter vers un document txt comme ceci:

using(var text = new StreamWriter("textfile.txt", false)) 
{ 
    text.Write(SB); 
} 

Il donne une autre version des données, complètement désaligné. Il devrait être identique à MyTextBox.Text.

Répondre

3

Tout d'abord, vous devrez choisir une police Fixed-Width pour votre zone de texte.

Ensuite, vous pouvez fournir un Padding amount à string.Format() (ou StringBuilder.AppendFormat)

 StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(string.Format("{0, -20}{1, -10}", "Title 1", "Title 2")); 
     sb.AppendLine(string.Format("{0, -20}{1, -10}", "Val Col 1 A", "Val Col 2 A")); 
     sb.AppendLine(string.Format("{0, -20}{1, -10}", "Val Col 1 B", "Val Col 2 B")); 

     Console.WriteLine(sb.ToString()); 

Résultats dans:

Title 1    Title 2 
Val Col 1 A   Val Col 2 A 
Val Col 1 B   Val Col 2 B 
+0

Je pense que vous vouliez dire, "peut fournir". –

1

Pour (incomplètement) répondre à votre première question. Plutôt que d'utiliser le même nombre d'onglets pour chaque chaîne, vous devez compter le nombre de caractères de la chaîne, car il peut contenir un, deux ou plusieurs «onglets» de caractères supplémentaires. Par exemple, considérons les deux chaînes suivantes:

"Hi" 
"Hello there" 

Si vous avez ajouté le même nombre d'onglets à chacun de ces second serait encore plus, en supposant un onglet de 4 espaces.

Vous pouvez le faire manuellement avant de commencer à ajouter des onglets et ensuite ajouter seulement assez d'onglets pour prendre la longueur au montant désiré, ou vous pouvez utiliser l'instruction format (voir les réponses de Eoin).

Pour (peut-être) répondre à votre deuxième question. Après avoir compté la longueur du texte initial, vous pouvez ajouter le nombre requis d'espaces plutôt que d'onglets, puis, en supposant que vous ayez une police non proportionnelle, les nombres seront toujours alignés.

+0

Vous pouvez le faire est une étape avec string.format ou stringbuilder.appendformat, en spécifiant une quantité de remplissage avec l'identificateur de format {0} –

+0

J'ai réalisé qu'après que j'avais affiché, mais je voulais souligner la étapes que le PO devait envisager. – ChrisF

1

L'alignement des caractères est obtenu avec des polices à espacement fixe - sélectionnez quelque chose comme courier-new comme police pour la zone de texte et l'impression.

Voir string-padding-problem (Peut-être que votre MessageBox affiche une police à hauteur variable?).

0

vous pourriez lookinto aussi les méthodes .padleft .padright (int) qui ajouter des espaces à gauche ou à droite pour aider à garder les choses alignées.

Vous pourriez également lookinto votre police Curior est guly mais son fait pour que chaque charte reprend le même WM espace exact i Des choses comme ça où, dans d'autres polices je prendrais moins de place qu'un W

0

Si c'est juste des nombres, qui causent les problèmes d'espacement, figure spaces peuvent juste les aligner correctement.

int bigNumber = 1234; 
int smallNumber = 5; 

string bigNumberString = bigNumber.ToString(); 
string smallNumberString = smallNumber.ToString(); 

// This works only in a TextBox with a monospaced font. 
textBox1.Text = string.Format("{0,4}\n{1,4}", 
    bigNumberString, 
    smallNumberString); 

// This works in TextBoxes with any font. 
textBox1.Text = string.Format("{0}\n{1}", 
    bigNumberString, 
    smallNumberString.PadLeft(bigNumberString.Length, '\u2007')); 
Questions connexes