我需要在特定格式的消息框中打印一个字符串,我使用的代码如下所示:
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
所以你可以看到第二行格式不正确。 可能这种情况正在发生,因为我在MessageBox中打印它。 角色和“空间”所占据的空间是不同的。 对此有何解决方案?
答案 0 :(得分:5)
尝试使用\t
在值之间插入标签。
答案 1 :(得分:2)
这不起作用,因为MessageBox使用按比例间隔的字体,字母M比字母l宽得多。就像在这条消息中你现在正在阅读。如果使用固定间距字体显示,您只能期望这样的对齐。更改消息框字体是不合适的,它是系统设置。
使用标签可以让它更好一些:
text += String.Format("{0}\t{1}\t{2}", a, b, c);
但如果字段大小接近标签大小,则不是万无一失。使用带有View = Details的ListView。
答案 2 :(得分:1)
不确定它是否真的是您的意思,但请使用monospaced字体,例如“Courier New”。如果你已经做了,那么抱歉这个明显的答案。
没关系:标准MessageBox无法使用此thread。也许然后一个选项是创建自己的MessageBox类。
答案 3 :(得分: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
中缺少相同宽度的字体,它没有正确排列。但另一方面,在控制台应用程序使用相同宽度的字体时,它确实排成一行。
答案 4 :(得分:0)
MessageBox类,无论是来自Forms还是WPF,都只是win32消息框的包装器,所以程序员不能(轻松)做一些事情,比如将字体更改为固定间距字体,这样所有字符都行很好地使用字符串格式。
然而,你可以使用Form和Label(以及你需要的任何按钮)制作自己的MessageBox克隆,然后使用ShowDialog()方法显示它。