2010-05-10 18 views
3

J'ai une zone de texte ASP avec TextMode définie sur MultiLine. J'ai des problèmes avec la préservation des caractères vbCrLf lorsqu'un utilisateur essaie d'insérer des sauts de ligne dans le texte. Quand un bouton sur la page est pressé, je prends le texte du contrôle, l'ajustant en utilisant String.Trim, et assignant cette valeur à une propriété String sur un objet (qui, à son tour, l'assigne à une variable String interne privée sur l'objet). L'objet prend alors la valeur de la variable interne privée et la jette dans la base de données en utilisant un appel de procédure stockée (le paramètre SP dans lequel il est placé est un nvarchar (4000)).vbCrLf dans Multiline TextBox apparaît uniquement lorsque .Trim() est appelé

ASPX Page:

<asp:UpdatePanel ID="UpdatePanel2" runat="server" RenderMode="Inline" UpdateMode="Conditional" 
       ChildrenAsTriggers="true"> 
    <ContentTemplate> 
    <!-- some other controls and things --> 
    <asp:TextBox TextMode="MultiLine" runat="server" ID="txtComments" Width="100%" Height="60px" CssClass="TDTextArea" Style="border: 0px;" MaxLength="2000" /> 
    <!-- some other controls and things --> 
    </ContentTemplate> 
</asp:UpdatePanel> 
Code

derrière:

ProjectRequest.StatusComments = txtComments.Text.Trim 

propriété d'objet:

Protected mStatusComments As String = String.Empty 
Property StatusComments() As String 
    Get 
    Return mStatusComments.Trim 
    End Get 
    Set(ByVal Value As String) 
    mStatusComments = Value 
    End Set 
End Property 

stockées appel proc:

Common.RunSP(mDBConnStr, "ProjectStatusUpdate", _ 
    Common.MP("@UID", SqlDbType.NVarChar, 40, mUID), _ 
    Common.MP("@ProjID", SqlDbType.VarChar, 40, mID), _ 
    Common.MP("@StatusID", SqlDbType.Int, 8, mStatusID), _ 
    Common.MP("@Comments", SqlDbType.NVarChar, 4000, mStatusComments), _ 
    Common.MP("@PCTComp", SqlDbType.Int, 4, 0), _ 
    Common.MP("@Type", Common.TDSqlDbType.TinyInt, 1, EntryType)) 

Voici la partie la plus étrange. Quand je déboguer le code, si je tape

« test
test »

(sans les guillemets) dans la zone de texte de commentaires, puis cliquez sur le bouton Enregistrer et utilisez la fenêtre immédiate pour afficher les valeurs variables comme Je traverse, voici ce que je reçois:

?txtComments.Text 
"test test" 
?txtComments.Text.Trim 
"test 
test" 
?txtComments.Text(4) 
" 
"c 
?txtComments.Text.Trim()(4) 
" 
"c 

Quelqu'un sait ce qui se passe ici?

+0

avez-vous un problème ou vous vous demandez simplement ce qui se passe? – lincolnk

+0

Je l'ai vérifié mais j'ai eu "test de test" dans les deux cas –

Répondre

8

Il y a deux problèmes ici. Tout d'abord, la fenêtre immédiate dans VB convertit le caractère non imprimable en un espace de sorte que vous ne pouvez pas le voir. En C#, il affichera le caractère en utilisant son code d'échappement de remplacement (par exemple, \n ou \r\n), mais pas VB. Deuxièmement, VB voit la rupture comme un saut de ligne uniquement (vbLf) et non comme un retour chariot + un saut de ligne (vbCrLf). Ainsi, si vous effectuez les opérations suivantes en mode pause dans la fenêtre immédiate, vous verrez ce que je veux dire (en supposant que vous tapez test, appuyez sur Entrée, test dans la boîte de commentaires):

?txtComments.Text.Substring(4,1) = vbLf 
True 
2

Peut être, vous devez utiliser Environment.NewLine constant pour être remplacé par le vbCrLf