web-dev-qa-db-fra.com

Pourquoi StringBuilder.AppendLine n'ajoute pas de nouvelle ligne avec certaines chaînes?

J'essaie d'utiliser stringbuilder pour créer un corps de chaîne à utiliser dans un email texte (pas HTML). Cependant, certaines lignes (où j'inclus des données dynamiques, une nouvelle ligne n'est pas ajoutée, mais dans certains cas, la nouvelle ligne fonctionne comme prévu.

Y a-t-il quelque chose de fondamental qui me manque lorsque j'utilise la classe stringbuilder ou existe-t-il un processus plus fondamental qui devrait se dérouler?

dans le code ci-dessous:

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 et thisEvent sont des classes personnalisées générées à l'aide de Subsonic (v2). PageTitle est un type de sortie de chaîne)

est obtenir ceci comme une sortie:

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

comme vous pouvez le constater, tout ce qui se trouve après la 3ème ligne du code fait que tout passe à une ligne.

cependant, plus loin dans le code que j'utilise:

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

et tous ceux-ci apparaissent sur des lignes séparées correctement. Je ne vois pas pourquoi cela se produit.

l'e-mail est composé comme tel

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


ajoutant le code suivant:

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

produit la sortie suivante:

Selected event : My Event

Date of event : 16 Sept 2012

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

ce qui fonctionne, je suppose, sauf que sont ajoutées 2 nouvelles lignes (la AppendLine et la Environment.NewLine). il semble que l'extraction des données directement de la base de données dans un constructeur de chaînes semble interférer avec la fin de la ligne. Même si j'ajoute du texte après l'extraction de la base de données, il reste sur une ligne.

METTRE À JOUR

faire StringBuilder.Append("blah"+Environment.NewLine) donne le résultat correct, mais je ne comprends toujours pas pourquoi cela fonctionne et .AppendLine("blah"+<database content>) ne fonctionne pas.

28
kolin

Au lieu de

sbUser.AppendLine();

Essayez d'utiliser

sbUser.Append(Environment.NewLine);

Aucune idée pourquoi cela fonctionne ...

24
oleksii

Je sais que la question est ancienne et qu'elle a été marquée comme étant résolue, mais je pensais l'ajouter ici au cas où quelqu'un d'autre l'aurait vu, car il s'agit du premier hit sur Google pour StringBuilder.AppendLine () ne fonctionne pas.

J'ai eu le même problème et il s'est avéré que c'était un problème avec Outlook. Outlook reformate les e-mails en mode texte en supprimant les sauts de ligne supplémentaires. Vous pouvez cliquer sur "Nous avons supprimé les sauts de ligne supplémentaires dans ce message -> Restaurer les sauts de ligne" dans l'en-tête de chaque e-mail ou modifier le paramètre permettant cette astuce "Options-> Mail-> Format du message-> Supprimer la ligne supplémentaire. coupures dans les messages en texte brut "

La solution de contournement (étant donné que vous ne pouvez pas contrôler les paramètres de chaque cible d'e-mail potentielle), j'ai trouvé ici Mise en forme de la lettre d'information et problème de suppression des sauts de ligne supplémentaires . chaque ligne, Outlook ne reformate pas le courrier électronique.

Voici une méthode d'extension pour vous aider (le nom de la méthode est un peu prolixe alors changez à votre goût :))

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

utiliser 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 Build 15007. Les terminateurs de ligne par défaut et Environment.NewLine sont tous deux "\ n". Pour utiliser "\ r\n", je devais créer une constante de chaîne et l’utiliser à la place.

0
ColinPBriggs

utilisez Environment.NewLine après chaque ligne ou à l'endroit où vous voulez créer une nouvelle ligne

par exemple:-

  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