asp.net
  • data-binding
  • nullable
  • 2010-03-25 4 views 5 likes 
    5

    У меня есть свойство int? MyProperty как член в моем источнике данных (ObjectDataSource). Могу ли я связать это с TextBox, какСвязывание nullable int с asp: TextBox

    <asp:TextBox ID="MyTextBox" runat="server" Text='<%# Bind("MyProperty") %>' /> 
    

    В основном я хочу, чтобы получить значение null отображается как пустой "" в TextBox, и номер как номер. Если TextBox пуст, MyProperty должен быть установлен в null. Если у TextBox есть номер, MyProperty должен быть установлен на этот номер.

    Если я попробую, я получаю исключение: «Пустое не является допустимым Int32».

    Но как я могу это сделать? Как работать с свойствами NULL и Bind?

    Заранее благодарен!

    ответ

    1
    <asp:TextBox ID="MyTextBox" runat="server" 
    
    Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' /> 
    

    Вы можете использовать HasValue для определения, является ли нулевой тип нулевым, а затем установить свойство Text.

    +2

    Спасибо за ответ, enduro. Но это не работает вообще и даже не компилируется. Он будет работать с Эвалем (по крайней мере, после того, как он вернет Eval в Int?), Но Bind - это совсем другая история. – Slauma

    2

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

    public int? MyProperty { get; set; } 
    
    public string MyBindableProperty 
    { 
        get 
        { 
         if (MyProperty.HasValue) 
          return string.Format("{0}", MyProperty); 
         else 
          return string.Empty; 
        } 
    
        set 
        { 
         if (string.IsNullOrEmpty(value)) 
          MyProperty = null; 
         else 
          MyProperty = int.Parse(value); 
          // value should be validated before to be an int 
        } 
    } 
    

    , а затем привязать вспомогательное свойство к TextBox вместо оригинала:

    <asp:TextBox ID="MyTextBox" runat="server" 
        Text='<%# Bind("MyBindableProperty") %>' /> 
    

    Я Буду рад видеть другое решение.

    +0

    Это не работает внутри 'FormView', где источник данных является' EntityDataSource' - я просто получаю 'DataBinding: 'System.Web.UI.WebControls.EntityDataSourceWrapper' не содержит свойство с именем MyBindableProperty. ' – Rich

    4

    Ну, я нашел решение, которое включает в себя FormView, но вы не укажете, соответствует ли это вашему сценарию.

    Во всяком случае, в моем случае объект DataBound-ed является моим собственным (не так уж и важно), и трюк заключается в том, что при обновлении формы вы должны по существу присоединяться к событию pre-databound и повторно -Write пустой строки, как нулевое значение, так что структура может свойство вводить значение для построенного объекта:

    protected void myFormView_Updating(object sender, FormViewUpdateEventArgs e) 
    { 
        if (string.Empty.Equals(e.NewValues["MyProperty"])) 
         e.NewValues["MyProperty"] = null; 
    } 
    

    и аналогично при вставке

    protected void myFormView_Inserting(object sender, FormViewInsertEventArgs e) 
    { 
        if (string.Empty.Equals(e.Values["MyProperty"])) 
         e.Values["MyProperty"] = null; 
    } 
    

    что делает этот действительно весело является факт, что e сообщение об ошибке (не является допустимым Int32) на самом деле ошибочно и должно писать (не является допустимым Nullable), но тогда nullables были бы гражданами первого класса, не так ли?

     Смежные вопросы

    • Нет связанных вопросов^_^