ASP ListView - Eval () как отформатированный номер, Bind () как неформатированный? - PullRequest
0 голосов
/ 24 марта 2010

У меня есть ASP ListView, и у меня очень простое требование отображать числа в формате без запятой (12,123), в то время как они должны быть привязаны к базе данных без форматирования (12123). Я использую стандартную настройку - ListView с подключенным источником данных, используя Bind ().

Я преобразовал из более старого кода, поэтому я не использую элементы управления ASP.NET, просто формирую входные данные ... но я не думаю, что это имеет значение для этого:

<asp:SqlDataSource ID="MySqlDataSource" runat="server" 
  ConnectionString='<%$ ConnectionStrings:ConnectionString1 %>' 
  SelectCommand="SELECT NUMSTR FROM MY_TABLE WHERE ID = @ID" 
  UpdateCommand= "UPDATE MY_TABLE SET NUMSTR = @NUMSTR WHERE ID = @ID">
</asp:SqlDataSource>

<asp:ListView ID="MyListView" runat="server" DataSourceID="MySqlDataSource">
  <LayoutTemplate>
    <div id="itemplaceholder" runat="server"></div>
  </LayoutTemplate>
  <ItemTemplate>
    <input type="text" name="NUMSTR" ID="NUMSTR" 
      runat="server" value='<%#Bind("NUMSTR")%>' />
    <asp:Button ID="UpdateButton" runat="server" Text="Update" Commandname="Update" />  
  </ItemTemplate>
</asp:ListView>

В приведенном выше примере NUMSTR - это число, но хранится в виде строки в базе данных SqlServer 2008. Я также использую ItemTemplate для чтения и редактирования шаблонов, чтобы сэкономить на дубликате HTML. В примере я получаю только неформатированный номер. Если я преобразую поле в целое число (через SELECT) и использую строку формата, такую ​​как Bind("NUMSTR", "{0:###,###}"), оно записывает отформатированное число в базу данных, а затем завершается неудачно, когда пытается снова прочитать его (не может преобразовать запятая там).

Есть ли какое-нибудь элегантное / простое решение для этого? Настолько легко запустить двустороннее связывание, и я думаю, что должен быть способ легко форматировать вещи ...

О, и я стараюсь избегать стандартного подхода ItemTemplate и EditItemTemplate, просто для разметки, необходимой для этого.

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Как видно из моего комментария выше, я в итоге просто удалил запятые из коллекции NewValues ​​в событии ListView ItemUpdating и добавил запятые в событии ItemDataBound.

Если есть другие способы сделать это чисто, мне интересно!

Код в VB.NET, синтаксис комментариев сделан совместимым с подсветкой stackoverflow:

Protected Sub myListView_OnItemDataBound(ByVal sender As Object, ByVal e As ListViewItemEventArgs) Handles myListView.ItemDataBound
    Dim intNumber As Integer
    For Each c As Control In e.Item.Controls
        If TypeOf c Is TextBox Then /*ASP textbox controls*/
            Dim numberText As TextBox
            numberText = DirectCast(c, TextBox)
            If Integer.TryParse(numberText.Text, intNumber) Then /*If the text can be parsed, format it*/
                numberText.Text = String.Format("{0:###,##0}", intNumber)
        End If
    Next
End Sub

Protected Sub myListView_OnItemUpdating(ByVal sender As Object, ByVal e As ListViewUpdateEventArgs) Handles myListView.ItemUpdating
    Dim cleanNumber As String
    Dim intNumber As Integer
    For Each key As String In e.NewValues.Keys
        cleanNumber = e.NewValues(key).ToString().Replace(",", Nothing) /*Remove all commas*/
        If Integer.TryParse(cleanNumber, intNumber) Then /*If the text can be parsed, format it*/
            e.NewValues(key) = intNumber.ToString()
        End If
    Next
End Sub
0 голосов
/ 01 апреля 2010

Не можете ли вы использовать стиль <% # Bind ("expression" [, "format"])%> ? Так что в вашем случае разработайте строку формата (я думаю, это должно быть " #, ### "), и ASP.NET сможет форматировать строку как на входе, так и на выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...