【问题标题】:String.Format()'s alignment behaves different when it comes to MessageBoxString.Format() 的对齐方式在 MessageBox 中表现不同
【发布时间】:2020-11-19 17:49:22
【问题描述】:

我正在使用 String.Format() 来格式化一些文本信息,它与 msdn 中记录的“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()的对齐方式。有什么办法可以处理这种情况吗?

【问题讨论】:

  • 在了解到这是因为字体类型之后,我制作了一个适用于 html 的消息框。所以问题解决了。现在我可以更灵活地格式化消息框了。

标签: c# messagebox string.format


【解决方案1】:

控制台使用monospaced font,而消息框使用可变宽度字体。这就是为什么对齐似乎没有保留在消息框中的原因。

在控制台中,空格与任何其他字符的宽度相同。在消息框中,空格没有那么宽(“i”和“l”之类的字符也没有),所以事情并没有按照你想要的方式排列。

在消息框中保持对齐的最接近方法是使用制表符而不是空格,但即便如此,由于某些单词的长度,事情可能不会对齐。

【讨论】:

    【解决方案2】:

    String.Format(...) 工作得很好,但由于字体的原因,它在消息框中没有对齐为表格!

    在您的控制台中,您使用固定宽度(等宽)字体,但消息框使用具有动态宽度的字体。因此,例如“M”比“i”或“”(空格)占用更多空间,这会打乱您的布局。

    作为you can't change the messagebox font,您必须使用支持自定义字体的任何类型的文本小部件创建自己的框架,例如TextBox 或只是普通的Label

    【讨论】:

      【解决方案3】:

      您可以使用制表符 (\t) 而不是空格来获得相同的列之间的距离,它应该在每种字体类型中都能完美工作:)

      【讨论】:

        【解决方案4】:

        在紧要关头,在每列之后使用制表符可能会奏效,但很容易出错。

        //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());
        

        这会产生:

        【讨论】:

          【解决方案5】:

          我为此苦苦挣扎了一段时间,这就是我解决这个问题的方法:

          string messageBoxText = "";
          
          messageBoxText += "'Text 1'".PadRight(40) + "\t" + "text2" + "\n";
          messageBoxText += "'Long Text 3'".PadRight(40) +"\t" + "text4" + "\n";
          
          MessageBox.Show(messageBoxText);
          

          您将在 MessageBox 中获得此格式化字符串,关键是在右侧填充文本后添加 \t

          【讨论】:

            猜你喜欢
            • 2021-06-12
            • 2012-10-14
            • 1970-01-01
            • 2023-02-22
            • 2020-08-02
            • 2010-12-22
            • 1970-01-01
            • 2015-10-10
            • 2016-03-15
            相关资源
            最近更新 更多