2014-09-18 75 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