3

我需要以特定格式在消息框中打印一个字符串,为此我使用类似于如下所示的代码:

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 中打印它。一个字符和一个“空格”占用的空间是不同的。有什么解决办法吗?

4

5 回答 5

5

尝试使用 a\t在值之间插入制表符。

于 2010-07-02T18:26:02.130 回答
2

这不起作用,因为 MessageBox 使用按比例间隔的字体,字母 M 比字母 l 宽得多。就像你现在正在阅读的这条消息一样。如果使用固定间距字体显示,您只能期望这样的对齐方式有效。更改消息框字体不合适,这是系统设置。

您可以通过使用标签来获得更好的效果:

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

但是如果字段大小接近标签大小,它就不是万无一失的。改为使用带有 View = Details 的 ListView。

于 2010-07-02T18:49:12.877 回答
1

不确定它是否真的是你的意思,但使用像“ Courier New ”这样的等宽字体。如果您已经这样做了,那么对于这个明显的答案感到抱歉。

没关系:使用标准 MessageBox 编码这个线程是不可能的。也许然后一个选项是创建您自己的 MessageBox 类。

于 2010-07-02T18:44:22.310 回答
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,它没有正确排列。但另一方面,在控制台应用程序使用相同宽度的字体时,它确实对齐。

于 2010-07-02T18:35:42.770 回答
0

MessageBox 类,无论是来自 Forms 还是 WPF,只是 win32 消息框的包装,因此程序员无法(轻松)执行诸如将字体更改为固定间距字体等操作,以便所有字符与字符串格式化。

但是,您可以使用 Form 和 Label(以及您需要的任何按钮)制作自己的 MessageBox 克隆,然后使用 ShowDialog() 方法显示它。

于 2010-07-02T18:51:05.333 回答