2010-07-02 78 views
3

我需要打印在針對我使用類似於代碼特定格式的消息框的字符串,如下所示:問題的在C#與的String.Format格式化的字符串

string text=""; 
for (int i=0; i<n; i++) 
{ 
    a=.. 
    b=.. 
    c=.. 
    text += String.Format("{0, -8} {1,-4} {2,8}", a, b, c); 
} 
MessageBox.Show(text); 

因此,對於下面的一組值:

XYZ,ABC,100 

X,ABC,100 

我獲得以下的輸出:

XYZ  ABC  100 

X  ABC  100 

所以你可以看到第二行是沒有得到很好FORMATT編輯。 可能是因爲我在MessageBox中打印出現這種情況。 角色和「空間」所需的空間是不同的。 任何解決方案?

+1

使用調試器找出它是否是String.Format()或MessageBox。 – 2010-07-02 18:29:38

+1

只是一個提示(與問題無關):在編寫循環時,寧願使用StringBuilder,而不是在字符串中使用+ =(字符串是不可變的,因此+ =代價高昂),而不是這對您的情況會有很大影響。 – jdehaan 2010-07-02 18:40:36

回答

5

嘗試使用\t在值之間插入選項卡。

+0

+1這是把事情在一個消息排隊的唯一途徑。 – 2010-07-02 18:41:17

0

在Windows應用程序用下面的代碼創建了一個測試:

public void Test1() 
    { 
     List<List<String>> list = new List<List<string>>() { 
      new List<String>() { "XYZ", "ABC","100" }, 
      new List<String>() { "X", "ABC", "100"}, 
     }; 

     string text = "", a = "", b = "", c = ""; 
     for (int i = 0; i < list.Count; i++) 
     { 
      a = list[i][0]; 
      b = list[i][1]; 
      c = list[i][2]; 
      text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine); 
     } 
     MessageBox.Show(text); 
    } 

請問你說的話,但經過與下面的代碼控制檯應用程序檢查它:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test1(); 
      Console.ReadKey(); 
     } 

     public static void Test1() 
     { 
      List<List<String>> list = new List<List<string>>() { 
       new List<String>() { "XYZ", "ABC","100" }, 
       new List<String>() { "X", "ABC", "100"}, 
      }; 

      string text = "", a = "", b = "", c = ""; 
      for (int i = 0; i < list.Count; i++) 
      { 
       a = list[i][0]; 
       b = list[i][1]; 
       c = list[i][2]; 
       text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine); 
      } 
      Console.WriteLine(text); 
     } 
    } 
} 

它做什麼你的期望。

因此,測試表明如果正在做它應該做的事情,但由於MessageBox中缺少相同寬度的字體,它不能正確排列。但另一方面,在控制檯應用程序使用相同寬度的字體的情況下,它確實排列整齊。

1

不確定它是否實際上是你的意思,但使用monospaced字體,如「Courier New」。如果你已經做到了,那麼很抱歉,這個明顯的答案。

沒關係:標準MessageBox根據此thread而不可能。也許那麼一個選項就是創建你自己的MessageBox類。

2

這不起作用,因爲MessageBox使用比例間隔的字體,字母M比字母l寬得多。就像在這個消息中你現在正在閱讀。如果使用固定間距字體顯示,則只能期望像這樣的對齊。更改消息框字體不合適,這是一個系統設置。如果字段大小接近的標籤尺寸

text += String.Format("{0}\t{1}\t{2}", a, b, c); 

,但它也不是省油的性能:

可以稍好通過使用標籤得到它。改用View = Details來使用ListView。

0

無論是來自Forms還是WPF,MessageBox類只是win32消息框的一個包裝,所以程序員不能(很容易)做這樣的事情,比如將字體改爲固定間距字體,這樣所有字符與字符串格式很好地排隊。然而,您可以使用Form和Label(以及您需要的任何按鈕)製作自己的MessageBox克隆,然後使用ShowDialog()方法顯示它。