web-dev-qa-db-ja.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)を使用して構築されたカスタムクラスです。Pag​​eTitleは文字列の出力タイプです)

これを出力として取得します:

_    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行目以降はすべて1行になります。

しかし、私が使用するコードをさらに下に:

_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)が追加されていることを除いて、動作すると思います。データをデータベースから直接文字列ビルダーに直接引っ張ると、行末が混乱するようです。データベースのプル後にテキストを追加しても、1行のままです。

[〜#〜] update [〜#〜]

StringBuilder.Append("blah"+Environment.NewLine)を実行すると正しい結果が生成されますが、それがなぜ機能し、.AppendLine("blah"+<database content>)が機能しないのかはまだわかりません。

29
kolin

の代わりに

sbUser.AppendLine();

使用してみてください

sbUser.Append(Environment.NewLine);

なぜこれが機能するのか分かりません...

25
oleksii

質問が古く、回答済みとしてマークされていることはわかっていますが、StringBuilder.AppendLine()が機能しないためにGoogleで最初にヒットしたため、他の誰かがこれに遭遇した場合に備えて、ここに追加すると思いました。

私は同じ問題を抱えていたが、それはOutlookの問題であることが判明した。 Outlookは、余分な改行を削除して、テキストベースの電子メールを再フォーマットします。個々のメールのヘッダーで[このメッセージの余分な改行を削除した->改行を復元する]をクリックするか、この厄介な小さなトリックを行う設定を変更することができます "オプション->メール->メッセージ形式->余分な行を削除プレーンテキストメッセージの中断」

回避策(すべての潜在的な電子メールターゲットの設定を制御できないため)ここで見つけた ニュースレターの書式設定と余分な改行の削除の問題 。基本的に、各行の先頭に2つの空白文字を追加すると、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);
        }
    }
}
32
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 Insider preview Build15007。デフォルトのラインターミネーターと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