将字符串设置为某个位置

时间:2016-03-23 11:28:01

标签: c# asp.net string padding

我正在尝试通过电子邮件发送清单,但我无法将这些行排成一行。

string aheading = "Defects:";
string bheading = "Comments:";

string result = aheading.PadRight(20, ' ') + bheading.PadRight(20, ' ') + Environment.NewLine;

foreach (var item in chkList.CheckItems)
{
    if (item.Defect == true)
    {
        result += item.ItemTitle.Trim().PadRight(20,' ') +  item.Comment.Trim().PadRight(20,' ') + Environment.NewLine ; 
    }
}

在数据库中有一个缺陷和注释列表,因此代码循环显示每个缺陷,并在单独的行上发表评论,但它看起来像这样:

Defects:            Comments:                     
Vehicle Secure           comment1                      
Brakes              comment2

有没有办法让评论排好?这就像vehicle secure字符串正在推出评论。可能会有很长的缺陷列表,我不知道每个字符串会有多长,所以我可以将注释设置为显示在某个位置吗?

3 个答案:

答案 0 :(得分:3)

将字符串格式化为HTML,然后您可以使用表格进行格式化。 mailmessage有一个属性可以将其内容设置为Html。

            var htmlstring = "<table>";
            htmlstring += "<tr><th>Header</th><th>Header</th></tr>";
            foreach (var row in content)
            {
                htmlstring += string.Format("<tr><td>text</td><td>{0}</td></tr>", row.data);
            }

            htmlstring += "</table>";

            var message = new MailMessage();
            message.IsBodyHtml = true;
            message.Body = htmlString;

实施问题中的代码

        string aheading = "Defects:";
        string bheading = "Comments:";

        string result = string.Format("<table><tr><th>{0}</th><th>{1}</th></tr>", aheading, bheading);

        foreach (var item in chkList.CheckItems)
        {
            if (item.Defect == true)
            {
                result += string.Format("<tr><td>{0}</td><td>{1}</td></tr>", item.ItemTitle.Trim(), item.Comment.Trim());
            }
        }

        result += "</table>";

        var message = new MailMessage();
        message.IsBodyHtml = true;
        message.Body = result;

        // SEND MESSAGE
        var client = new SmtpClient("mailhost");
        // If auth is needed
        client.Credentials = new NetworkCredential("username", "password");
        client.Send(message);

答案 1 :(得分:1)

你应该计算字符串的长度。

首先,浏览所有CheckItems并找到最长的ItemTitle

其次,创建变量padding以放置最大填充。

最后,您可以使用String.Format

计算每一行的填充
string aheading = "Defects:";
string bheading = "Comments:";

int maxlength = 0;
foreach (var item in chkList.CheckItems)
{
    if (item.ItemTitle.Length > maxlength)
        maxlength = item.ItemTitle.Length;
}

int padding = maxlength + 10;  //10 spaces between the longest 'Defects' and its 'Comments'
string format = "{0,-" + padding + "} {1,-" + padding + "}\r\n"

string result = String.Format(format, "Defects:", "Comments:");

foreach (var item in chkList.CheckItems)
{
    if (item.Defect == true)
    {
        result += String.Format(format, item.ItemTitle, Item.Comment);
    }
}

注意

当前字体中的每个字符都应具有相同的宽度。

您应该在邮件中使用Monospaced Font来使其正常运行。

如果您希望它适用于所有字体。请改为@ Gelootn的答案。

答案 2 :(得分:1)

使用String.Format,而不是.padright。

创建一个字符串,例如:

string title = String.Format("{0,-10} {1,-10}\n", "Defects:", "Comments:");

然后在你的循环中使用:

string result = String.Format("{0,-10} {1,-10}\n", item.ItemTitle, item.Comment);

您必须调整值才能让它看起来很满意。