2012-06-22 13 views
28

Bir metin (HTML değil) e-postasında kullanılacak bir dize gövdesi oluşturmak için stringbuilder kullanmaya çalışıyorum. Bununla birlikte, bazı satırlar (dinamik verileri dahil ettiğim, yeni bir satır eklenmez, ancak bazı satırlarda hedeflenen şekilde çalışır.Neden StringBuilder.AppendLine, bazı dizelerle yeni bir satır eklemiyor?

Stringbuilder sınıfını kullanırken eksik olan temel bir şey var mı yoksa daha temel bir işlem var mı? bunun söz konusu olmalıdır

aşağıdaki kodu:?

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 ve thisEvent ses altı (v2) kullanılarak inşa özel sınıflar PageTitle dizesinin bir çıkış türüdür.)

bu olsun bir çıkış olarak:

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 ============================================================== 

Görüldüğü gibi, koddaki 3. satırdan sonra her şey her şey bir satıra gider.

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

ve bu doğru ayrı hatlar üzerinde görüntülenir:

ancak, daha kod aşağı i kullanma. Bunun neden olduğunu göremiyorum.

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

aşağıdaki çıktıyı üretir:

Selected event : My Event 

Date of event : 16 Sept 2012 

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

E aşağıdaki kodu ilave edilmesi bu gibi

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


olarak oluşmaktadır, sanırım 2 yeni satır ekledi (AppendLine ve Environment.NewLine). Veriyi doğrudan veritabanından bir stringbuilder'a çekmenin satır sonuyla uğraştığı görülüyor. Veritabanı çekildikten sonra metin eklesem bile, hala bir satırda kalır.

StringBuilder.Append("blah"+Environment.NewLine) yapıyor GÜNCELLEME

çalışır ve .AppendLine("blah"+<database content>) çalışmıyor bu yüzden ancak hala anlayamıyorum, doğru sonucu verir.

+0

SbUser.ToString() çağrısından sonra dizeye bir şey mi yapıyorsunuz? –

+0

PageTitle'nin metin akışını kesebilecek garip değerler döndürme ihtimali var mı? Veya çağrılan kod geçici olarak kültürü veya satırsonu ayarını değiştirir mi? Başka bir deyişle, "olayım" kodunu kodlarsanız, sorun devam eder mi? ** edit ** cevabınızı düzenlediğiniz şüpheyi doğrular;) –

+0

StringBuilder'ı varsayılan kapasite ile oluşturmaya çalışabilir misiniz? Örneğin: 'StringBuilder sb = new StringBuilder (1024);' – Steve

cevap

22

yerine

sbUser.AppendLine(); 

ait

sbUser.Append(Environment.NewLine); 

neden bu işleri yok fikri kullanmayı deneyin ...

+11

AppendLine sadece bunu çağırır.Append (Environment.NewLine); –

+2

bu doğru sonucu verir, ancak bu neden olur ve değil AppendLine? – kolin

+1

StringBuilder sınıfını derledikten sonra 'this.Append (Environment.NewLine);'Yani teknik olarak her ikisi de aynı sonucu vermeli –

6

kullanım 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); 
+0

("=======" satır ekleme, kendi başına normale döner. – kolin

+0

bunu yapar Yoksa sbUser.ToString()? 'I mi yapıyorsunuz? – Liam

+2

[* Varsayılan satır sonlandırıcı, Environment.NewLine özelliğinin * geçerli değeridir] (http://msdn.microsoft.com/en-us/library/ ebk18257% 28v = vs90% 29.aspx) – V4Vendetta

0

kullanım Environment.NewLine her satırdan sonra veya yeni hat istediğiniz yere

örn: -

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); 
25

Ben soru eski ve cevap olarak işaretlendi biliyorum , ama ben bunun için başka birisinin buraya gelmesi durumunda buraya ekleyeceğimi düşündüm, çünkü StringBuilder.AppendLine() için Google'da ilk çalışma değil.

Aynı sorun vardı ve bir Outlook sorunu olduğu ortaya çıktı. Outlook, ek satır sonlarını kaldırarak metin tabanlı e-postaları yeniden biçimlendirir. Tek tek e-postaların başlığında "Bu satırdaki ek satır sonlarını kaldırdık -> Satır sonlarını geri yükledik" ya da bu küçük tıkırtıyı değiştiren ayarları değiştirebiliriz "Seçenekler -> Posta -> Mesaj Biçimi-> Ek satırı kaldır düz metin iletilerinde kesmeler "

Çözüm (tüm potansiyel e-posta hedeflerinde ayarları denetleyemediğinizden) burada Newsletter Formatting And The Remove Extra Line Breaks Issue bulundu. Temel olarak, her satırın başına iki beyaz boşluk karakteri eklerseniz, Outlook e-postayı yeniden biçimlendirmez.

İşte sbUser.Appendline();

İkinci sbUser.Append("texto loco ");

Voila

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); 
     } 
    } 
} 
+0

Teşekkür ederim! Hatta mesajın üzerinde “gereksiz hat kesintileri” sıyırdı. cevabınızı okuduktan sonra gerçekleşti.) Büyük varsayılan davranış ... Ben sadece şunu yaptım: '' '+ myString.Replace (Environment.NewLine, Environment.NewLine +" ")' – Knickedi

+1

Bu aslında mesaj çalışmıyorsa işe yaramıyor HTML olarak biçimlendirilmiş. [http://stackoverflow.com/a/5020512/2 788458] (http://stackoverflow.com/a/5020512/2788458)
etiketlerini kullanın –

-3

İlk (yöntem adı biraz ayrıntılı yüzden beğeninize :) değiştirmek olduğunu) yardımcı olacak bir uzantısı yöntemidir!

=)

+0

Gerçekten ne demek istediğini açık değil. Lütfen cevabınızı biçimlendirin ve bunun neden işe yaradığını daha fazla açıklama ekleyin. – ryanyuyu

0

Windows 10 İçeriden önizleme kurmak 15007. Standart Hat Terminatör ve Environment.NewLine hem "\ n" dir. "\ R \ n" işlevini kullanmak için bir dize sabiti oluşturmak ve bunun yerine kullanmak zorundaydım.

+0

Böyle bir şeyin asla gerçekleşmeyeceğine dair bir fikrim var çünkü bu bir kırılma olayı. Net Framework veya bir şey yerine .Net Core kullanıyor musunuz? 4.6.2'yi hedeflerken 16199 Net Framework üzerine CRLF alıyorum. – binki