2017-05-20 8 views
-1

Ich habe Probleme mit meinen vier Säulen ausrichten:String.Format Ausrichtung

enter image description here

Mein String-Format für den Titel richtig funktioniert. Wenn ich die nächste Zeile lese und in eine Liste lege, nimmt String.Format den Video-Namen und erstellt die Spalten, die an die Länge des Video-Namens angepasst sind. Wie kann ich das beheben?

Private Sub pdPrint_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles pdPrint.PrintPage 

    e.Graphics.DrawString("Movie Collection", New Font("Courier", 20, FontStyle.Bold), Brushes.Black, 300, 10) 

    e.Graphics.DrawString(String.Format("{0, -20} {1,-20} {2, -20} {3,-20}", "VIDEO NAME", "YEAR PRODUCED", "RUNNING TIME", "RATING"), New Font("Courier", 12, FontStyle.Bold), Brushes.Black, 10, 70) 


    Using reader As New StreamReader("testing.txt") 
     Dim intVertPosition As Integer = 90 
     While Not reader.EndOfStream 
      Dim videoName As String = reader.ReadLine() 
      Dim yearProduced As String = reader.ReadLine() 
      Dim runningTime As String = reader.ReadLine() 
      Dim rating As String = reader.ReadLine() 
      Dim extraline As String = reader.ReadLine() 


      e.Graphics.DrawString(String.Format("{0, -30} {1,30} {2, 30} {3,30}", videoName.ToString(), yearProduced.ToString(), runningTime.ToString(), rating.ToString()), New Font("Courier", 12, FontStyle.Regular), Brushes.Black, 10, intVertPosition) 
      intVertPosition += 14 
     End While 
    End Using 


End Sub 
+0

Sie haben nicht beschrieben, was genau falsch ist, aber "String.Format" richtet sich innerhalb einer Zeichenfolge aus und hat nicht viel mit dem Textumfang zu tun (Groß- und Kleinschreibung usw.). Das sieht nach einem Berichtstyp aus, also könnten Sie eine virtuelle Tabelle mit 4 oder 5 Spalten verwenden, die entsprechend groß sind und den Text in ihnen rechtfertigen. Außerdem müssen Sie 'ToString()' nicht in einer Zeichenkette machen und eine 'Neue Schriftart' für jede Zeile wird Ressourcen verlieren. – Plutonix

+0

Die Berichtsobjekte sind nicht richtig ausgerichtet. Wenn ich Wächter der Galaxie eintippe, werden die Spalten nach dem Videonamen erstellt. Also, wenn ich einen anderen Film wie Tremors eintippe, werden sie außer dem "Video name" überhaupt nicht ausgerichtet. –

+0

Ich würde Tabellen verwenden, aber unglücklicherweise dockt meine Zuweisungsrubrik Punkte an, um alles außer String zu verwenden. Format –

Antwort

2
e.Graphics.DrawString(..., New Font("Courier", 20, FontStyle.Bold), ...) 

Dies ist, wo das Problem begann. Diese Art der Formatierung funktioniert nur, wenn die Breite eines Leerzeichens der Breite eines Buchstabens entspricht. Oder in anderen Worten, es erfordert eine Schriftart mit fester Teilung. Aber Sie können aus dem Screenshot deutlich erkennen, dass Sie eine proportional geneigte Schriftart haben. Je mehr Text also in der ersten Spalte steht, desto mehr wird die nächste Spalte herausgedrückt.

Dies ist passiert, weil Sie "Courier" ausgewählt haben. Es ist der Name eines Legacy Gerät Schriftart, nützlich nur in Programmen, die vor 27 Jahren geschrieben wurden. Graphics.DrawString() benötigt eine skalierbare Font-Gliederung, eine True-Type-Schriftart, um spezifisch zu sein, und kann keine Geräteschriftarten verwenden. Der Zeichensatz-Mapper bietet also eine Alternative, leider ist er nicht intelligent genug, um zu erkennen, dass Sie eine Schriftart mit fester Zeichen- folge haben wollen.

Beheben Sie das Problem, indem Sie stattdessen "Courier New" verwenden.

+0

Courier New ist irgendwie gut, hässlich. Eine neuere Monospace-Schriftart wie Andale Mono, Monaco, Consolas oder Droid Sans Mono könnte besser aussehen, wenn Sie wissen, dass Sie sie verfügbar haben können. Darüber hinaus scheint es hier in Ordnung zu sein (beide sind Courier 12, und fett sollte nicht wichtig sein), aber es ist erwähnenswert, vorsichtig zu sein, die _Same_ Schriftart und Größe zwischen der Kopfzeile und Körper zu verwenden, oder Abstand wird nicht ausgerichtet. –