2017-05-20 18 views
-1

私は4つの列を揃えるトラブルを抱えている:タイトルにString.Formatのアライメント

enter image description here

私の文字列の形式が正しく動作します。次の行を読み込んでリストに入れると、String.Formatはビデオ名をとり、ビデオ名の長さに合わせて列を作成します。これをどうすれば解決できますか?

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

あなたは何が間違っているのか説明しませんでしたが、 'String.Format'は文字列内で整列し、テキストエクステントとはあまり関係がありません(大文字と小文字は区別されません)。レポートタイプのように見えるので、それに応じて4〜5列の仮想表を使用して、その中のテキストを正当化することができます。また、文字列に対して 'ToString()'を実行する必要はなく、各行の 'New Font'をリークさせることになります。 – Plutonix

+0

レポートオブジェクトが正しく整列していません。 Guardians of the Galaxyと入力すると、動画名の後に列が作成されます。だから、私がTremorsのような別の映画を入力した場合、 "Video name"の他には全く整列しません。 –

+0

私はテーブルを使用しますが、残念なことに私の割り当てルークックは特にString.Format以外のものを使用するためにポイントをオフにします。 –

答えて

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

問題が始めたところです。この種の書式設定は、スペースの幅が文字の幅と同じ場合にのみ正しく機能します。つまり、固定ピッチフォントが必要です。しかし、あなたは比例的に投げられたフォントを持っていることをスクリーンショットからはっきりと知ることができます。したがって、大まかに言えば、最初の列のテキストが多いほど、次の列が押し出されます。

これは、あなたが「宅配便」を選んだために起こりました。従来の名前デバイスフォントは、27年前に書かれたプログラムでのみ有効です。 Graphics.DrawString()にはスケーラブルなフォントアウトライン、TrueTypeフォントが必要であり、デバイスフォントは使用できません。だから、フォントマッパーは別の方法を提供するために動いています。残念なことに、固定ピッチのフォントが必要だと認識するほどスマートではありません。

代わりに「Courier New」を使用して問題を解決してください。

+0

Courier Newはまあまあ、醜いです。 Andale Mono、Monaco、Consolas、Droid Sans Monoなどの新しいモノスペースフォントは、使用可能であることがわかっていれば、よりよく見えるかもしれません。さらに、ここでは大丈夫です(Courier 12でも太字でも問題ありません)が、ヘッダーと本文の間に_same_フォントとサイズを使用するように注意する必要があります。 –