it-roy-ru.com

Почему StringBuilder.AppendLine не добавляет новую строку с некоторыми строками?

Я пытаюсь использовать stringbuilder для создания тела строки для использования в текстовом (не HTML) электронном письме. Однако некоторые строки (где я включаю динамические данные, новая строка не добавляется, но в некоторых новая строка работает как задумано.

Есть ли что-то базовое, чего мне не хватает при использовании класса stringbuilder, или есть какой-то более фундаментальный процесс, который должен происходить?

в приведенном ниже коде:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]");
sbUser.AppendLine();
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine();

(ContentPage и thisEvent - это пользовательские классы, созданные с использованием Subsonic (v2). PageTitle - это выходной тип строки)

это получить в качестве вывода:

    Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]

Selected event : My Event Date of event : 16 Sept 2012 ==============================================================

как вы можете видеть, все, что находится после 3-й строки в коде, заставляет все идти в одну строку.

тем не менее, далее код, который я использую:

sbRR.AppendLine("First name : " + txtFirstname.Text.Trim());
sbRR.AppendLine("Surname : " + txtSurname.Text.Trim());
etc,

и все они появляются на отдельных линиях правильно. Я не понимаю, почему это происходит.

электронная почта составлена ​​как таковая

mailMessage.Body = sbUser.ToString() + sbRR.ToString();


добавив следующий код:

sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle + Environment.NewLine); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy") + Environment.NewLine);

производит следующий вывод:

Selected event : My Event

Date of event : 16 Sept 2012

==============================================================

который работает, я полагаю, за исключением того, что добавлено 2 новых строки (AppendLine и Environment.NewLine). кажется, что извлечение данных непосредственно из базы данных в строитель строк, похоже, портит конец строки. Даже если я добавлю текст после извлечения базы данных, он все равно останется на одной строке.

ОБНОВЛЕНИЕ

выполнение StringBuilder.Append("blah"+Environment.NewLine) дает правильный результат, однако я до сих пор не понимаю, почему это работает, а .AppendLine("blah"+<database content>) не работает.

28
kolin

Вместо

sbUser.AppendLine();

Попробуйте использовать

sbUser.Append(Environment.NewLine);

Понятия не имею, почему это работает ...

24
oleksii

Я знаю, что вопрос старый и помечен как отвеченный, но я подумал добавить это здесь, если кто-то еще столкнется с этим, так как это первое попадание в Google из-за того, что StringBuilder.AppendLine () не работает.

У меня была такая же проблема, и она оказалась проблемой Outlook. Outlook переформатирует текстовые электронные письма, удаляя лишние разрывы строк. Вы можете нажать «Мы удалили дополнительные разрывы строк в этом сообщении -> Восстановить разрывы строк» ​​в заголовке отдельного электронного письма или измените настройку, которая делает этот неприятный маленький трюк »Параметры-> Почта-> Формат сообщения-> Удалить лишнюю строку разрывы в текстовых сообщениях "

Обходной путь (так как вы не можете управлять настройками для каждой потенциальной цели электронной почты) я нашел здесь Форматирование рассылки и проблема удаления лишних разрывов строк . В основном, если вы добавляете два пробельных символа в начало Outlook не переформатирует электронную почту в каждой строке.

Вот метод расширения, чтобы помочь (имя метода немного многословно, поэтому измените по своему вкусу :))

namespace System.Text
{
    public static class StringBuilderExtensions
    {
        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb, string value)
        {
            sb.AppendFormat("{0}{1}{2}", "  ", value, Environment.NewLine);
        }

        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb)
        {
            sb.AppendFormat("{0}{1}", "  ", Environment.NewLine);
        }
    }
}
27
cjmurph

используйте Environment.NewLine

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]");
sbUser.AppendLine(Environment.NewLine);
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine(Environment.NewLine);
6
Liam

Предварительный просмотр инсайдерской версии Windows 10 Build 15007. Терминатор строки по умолчанию и Environment.NewLine оба являются\n. Чтобы использовать «\ r\n», я должен был создать строковую константу и использовать ее вместо этого.

0
ColinPBriggs

используйте Environment.NewLine после каждой строки или там, где вы хотите новую строку

например:-

  sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]" + Environment.NewLine);
  sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
0
Nighil