2014-09-18 183 views
0

我正在寫一個日誌分析器,並希望將數據輸出到列進行排序,而且目前使用此代碼:C#輸出日誌填充

string OEMVersion = string.Format("{0,-20} {1}", "OEM Version", GetXMLData(doc, "OemMarkerVersion")); 
string OEMID = string.Format("{0,-20} {1}", "OEM ID", GetXMLData(doc, "OemId")); 
string OEMTableID = string.Format("{0,-20} {1}", "OEM TableID", GetXMLData(doc, "OemTableId")); 
string Manufacturer = string.Format("{0,-20} {1}", "Manufacturer", GetXMLData(doc, "Manufacturer")); 
string Model = string.Format("{0,-20} {1}", "Model", GetXMLData(doc, "Model")); 

排序填充出來,但只輸出看起來不錯與某些字體(Consolas,Lucinda控制檯等)。我如何用標籤填充列而不是空格來克服這個問題? string.Format()似乎不允許我這樣做。謝謝。

+0

字體與寬度的比例不那麼容易對齊顯示的例子。另外如果你使用標籤。 – Steve 2014-09-18 22:04:27

+0

即使有選項卡,根據您的內容,您的輸出可能無法正確對齊。這意味着如果你的第二個「製造商」的值比第一個字符多4或8個字符,那麼這個標籤會將第二個字符推出。 – Shiva 2014-09-18 22:29:42

+0

我想知道這種對齊的原因。如果將這些變量簡單地寫入文件中,則無需擔心。當前的代碼完美地對齊它們,這只是使用正確字體的問題。如果這些變量應該在視頻上輸出,那麼我建議使用ListView或DataGridView來按列和行對齊數據,而不需要手動對齊它們 – Steve 2014-09-18 22:53:59

回答

0

只需在您的格式中添加製表符?

string OEMVersion = string.Format("{0,-20}\t{1}", "OEM Version", GetXMLData(doc, "OemMarkerVersion")); 
string OEMID = string.Format("{0,-20}\t{1}", "OEM ID", GetXMLData(doc, "OemId")); 
string OEMTableID = string.Format("{0,-20}\t{1}", "OEM TableID", GetXMLData(doc, "OemTableId")); 
string Manufacturer = string.Format("{0,-20}\t{1}", "Manufacturer", GetXMLData(doc, "Manufacturer")); 
string Model = string.Format("{0,-20}\t{1}", "Model", GetXMLData(doc, "Model")); 

您可能希望保留空格填充以減少較短的字符串不會越過較長字符串的選項卡之後的製表符的風險。贏得比例字體100%準確,但應該更清潔。

+0

謝謝,我會對此發揮作用,看看結果如何。 – tom982 2014-09-19 00:01:03

0

如果你想在使用可變寬度的字體正確的變量排列上的視頻輸出,那麼你需要一些類型的表格控制像ListViewDataGridView
(我假設一個WinForm應用程序的幫助但其他技術的概念是相同的)。

控件的使用是更可取的,因爲替代方法是測量每個字符串的像素長度,並使用Graphics.DrawString將字符串部分放置在確切的像素位置。

讓我用一個ListView

// Create a new ListView control. (or use the designer) 
ListView listView1 = new ListView(); 
// Position and size of the ListView 
listView1.Bounds = new Rectangle(new Point(10,10), new Size(500,200)); 
// Some display feature.... 
listView1.View = View.Details; 
listView1.FullRowSelect = true; 
listView1.GridLines = false; 

// Add OEM Version value 
ListViewItem item = new ListViewItem("OEM Version"); 
item.SubItems.Add(GetXMLData(doc, "OemMarkerVersion")); 
listView1.Items.Add(item); 

// Add OEM ID value 
item = new ListViewItem("OEM ID"); 
item.SubItems.Add(GetXMLData(doc, "OemId")); 
listView1.Items.Add(item); 

... and so on for the others values and labels .... 

// Some header formatting 
listView1.Columns.Add("Label", 100, HorizontalAlignment.Left); 
listView1.Columns.Add("Data", 400, HorizontalAlignment.Left); 

// Put the ListView on video.... 
yourForm.Controls.Add(listView1); 
+0

輸出必須是一個文本文件,所以使用控件將不起作用(這是一個控制檯應用程序 - 我錯過了這個細節的道歉),但是感謝你的代碼,這非常有趣! – tom982 2014-09-19 00:00:29