我使用String.Format()来格式化一些文本信息,它与“{3}}中记录的”Console.WriteLine()完美配合。
我的代码是这样的:
StringBuilder strBuilder = new StringBuilder();
strBuilder.AppendLine("Summary Information:");
strBuilder.AppendFormat("{0,-10}{1,-8}{2,-10}{3,-30}{4,-7}\n", "Header1", "Header2", "Header3", "Header4", "Header5");
strBuilder.AppendFormat("{0,-10}{1,-8}{2,-10}{3,-30}{4,-7}\n\n", "A", "1", "Y", "Long Information", "13");
string result = strBuilder.ToString();
Console.WriteLine(result);
控制台结果如下所示。
但是,当我尝试在MessageBox上显示它时,列正在移动。不知怎的,这些空间被吞没了。
MessageBox.Show(result, "MBox Test");
也没关系,因为我不是非常跪在.Net的“MessageBox”类上。它有很多局限性。
所以我决定实现一个自定义表单来显示这条消息。我尝试过使用Label和RichTextBox。但不幸的是,结果与MessageBox完全相同。
我很困惑。为什么.Net自己的控件不能支持String.Format()的对齐。有什么方法可以处理这种情况吗?
答案 0 :(得分:3)
控制台使用monospaced font,而消息框使用可变宽度字体。这就是为什么看起来对齐没有保留在消息框中。
在控制台中,空格与任何其他字符的宽度相同。在消息框中,空格不是那么宽(也不是像“i”和“l”这样的字符),所以事情并没有按照你想要的方式排列。
你能够在消息框中保持对齐最接近的是使用制表符而不是空格,但即使这样,由于某些单词的长度,事情可能也不会排列。
答案 1 :(得分:1)
String.Format(...)
效果非常好,但由于字体的原因,它在消息框中没有对齐!
在控制台中,您使用固定宽度(等宽字体)字体,但消息框使用动态宽度字体。因此例如" M"消耗的空间比'" i"或者" " (空间)这会弄乱你的布局。
作为you can't change the messagebox font,您必须使用支持自定义字体的任何类型的文本小部件创建自己的框架,例如TextBox
或仅普通的Label
。
答案 2 :(得分:0)
您可以使用制表符(\ t)而不是空格来获得列之间的相同距离,它应该在每种字体类型中都能完美运行:)
答案 3 :(得分:0)
在紧要关头,在每列之后使用制表符可能有效,但碰到的机会很大。
//I'm using Tuple Types and Interpolated Strings which are available in C# 7 and .NET 4.7+
(int, int, int) maxFieldLengths = (10, 10, 10); //Use 10 as the min length
List<(string, string, string)> values = new List<(string, string, string)>();
values.Add(("header1", "header2", "header3"));
values.Add(("value1", "value2", "value3"));
values.Add(("longerstringvalue", "value4", "evenlongerstringvaluehere"));
foreach (var value in values)
{
maxFieldLengths.Item1 = Math.Max(maxFieldLengths.Item1, value.Item1.Length);
maxFieldLengths.Item2 = Math.Max(maxFieldLengths.Item2, value.Item2.Length);
maxFieldLengths.Item3 = Math.Max(maxFieldLengths.Item3, value.Item3.Length);
}
var messageBuilder = new StringBuilder();
foreach (var value in values)
{
messageBuilder.AppendFormat($"{{0,{maxFieldLengths.Item1 * -1}}}\t| {{1,{maxFieldLengths.Item2 * -1}}}\t| {{2,{maxFieldLengths.Item3 * -1}}}{Environment.NewLine}",
value.Item1, value.Item2, value.Item3);
}
MessageBox.Show(messageBuilder.ToString());
这将产生:
答案 4 :(得分:0)