40

stringbuilder を使用して、テキスト (HTML ではない) メールで使用する文字列の本文を作成しようとしています。ただし、一部の行(動的データが含まれている場合、新しい行は追加されませんが、一部の行では改行が意図したとおりに機能します。

stringbuilder クラスを使用するときに欠けている基本的なものはありますか、それとももっと基本的なプロセスが必要ですか?

以下のコードで:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
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 someone@somewhere.com

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 行のままです。

アップデート

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

4

6 に答える 6

42

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

私は同じ問題を抱えていましたが、それは Outlook の問題であることが判明しました。Outlook は、余分な改行を削除して、テキスト ベースの電子メールを再フォーマットします。個々の電子メールのヘッダーにある [このメッセージの余分な改行を削除しました -> 改行を元に戻す] をクリックするか、この厄介な小さなトリックを実行する設定を変更します。"Options->Mail->Message Format->Remove extra line breaks in plain text messages"

回避策 (可能性のあるすべての電子メール ターゲットの設定を制御できないため)ニュースレターの書式設定と余分な改行の削除の問題を見つけました。基本的に、各行の先頭に 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);
        }
    }
}
于 2014-07-21T08:26:51.463 に答える
29

それ以外の

sbUser.AppendLine();

使ってみて

sbUser.Append(Environment.NewLine);

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

于 2012-06-22T12:07:24.697 に答える
6

使用するEnvironment.NewLine

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
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);
于 2012-06-22T12:07:32.160 に答える
0

Environment.NewLine各行の後または改行が必要な場所で使用します

例えば:-

  sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com" + Environment.NewLine);
  sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
于 2012-06-22T12:08:41.480 に答える
-3

初め sbUser.Appendline();

2番 sbUser.Append("texto loco ");

出来上がり!

=)

于 2015-06-11T18:54:53.750 に答える