vbCrLf в многострочном TextBox отображается только при вызове .Trim () - PullRequest
3 голосов
/ 10 мая 2010

У меня есть ASP TextBox с TextMode, установленным в MultiLine. У меня проблемы с сохранением символов vbCrLf, когда пользователь пытается вставить в текст разрывы строк. Когда кнопка на странице нажата, я беру текст из элемента управления, обрезаю его с помощью String.Trim и присваиваю это значение свойству String объекта (которое, в свою очередь, присваивает его закрытой внутренней переменной String на объекте). Затем объект берет значение из закрытой внутренней переменной и выбрасывает его в базу данных с помощью вызова хранимой процедуры (параметр SP, в который он помещается, представляет собой nvarchar (4000)).

Страница ASPX:

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

код позади:

ProjectRequest.StatusComments = txtComments.Text.Trim

свойство объекта:

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

сохраненный вызов процедуры:

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

Вот самая странная часть. Когда я отлаживаю код, если я наберу

"тест
тест "

(без кавычек) в текстовое поле для комментариев, затем нажмите кнопку сохранения и используйте непосредственное окно, чтобы просмотреть значения переменных, по мере того как я буду проходить, вот что я получаю:

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

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

8 голосов
/ 13 мая 2010

Здесь две проблемы в страхе. Во-первых, непосредственное окно в VB преобразует непечатный символ в пробел, чтобы вы не могли его увидеть. В C # он будет показывать символ, используя его замещающий управляющий код (например, \n или \r\n), а VB - нет. Во-вторых, VB видит разрыв только как перевод строки (vbLf), а не возврат каретки + перевод строки (vbCrLf). Таким образом, если вы выполните следующее в режиме прерывания в ближайшем окне, вы увидите, что я имею в виду (если вы наберете test, нажмите Enter, test в поле для комментариев):

?txtComments.Text.Substring(4,1) = vbLf
True
2 голосов
/ 19 мая 2010

Может быть, вам следует использовать константу Environment.NewLine для замены на vbCrLf

...