2010-03-25 23 views
5

我有一個屬性int? MyProperty作爲我的數據源(ObjectDataSource)中的成員。我可以綁定這一個TextBox,像綁定一個可爲空的int到一個asp:TextBox

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

基本上我想在文本框中顯示爲空白""一個null值,以及一些爲數字。如果文本框爲空,則MyProperty應設置爲null。如果TextBox中有一個數字,MyProperty應該被設置爲這個數字。

如果我嘗試它,我會得到一個異常:「空白不是有效的Int32」。

但我該怎麼做?如何使用可空屬性和綁定?

在此先感謝!

回答

1
<asp:TextBox ID="MyTextBox" runat="server" 

Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' /> 

您可以使用HasValue來確定可爲空的類型是否爲空,然後設置Text屬性。

+2

感謝您的回覆,耐力賽。但是這根本不起作用,甚至不能編譯。它會和Eval一起工作(至少在Eval返回int後?),但是Bind是另外一個故事。 – Slauma 2010-03-26 10:47:18

2

我開始相信它不可能綁定一個可爲null的值屬性。直到現在我只能看到解決方法增加一個額外的輔助屬性綁定可空類型:

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

,然後輔助屬性綁定到文本框代替原有的:

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

我很高興看到另一種解決方案。

+0

這不適用於'FormView',其中數據源是一個'EntityDataSource' - 我只是'DataBinding:'System.Web.UI.WebControls.EntityDataSourceWrapper'不包含名爲'MyBindableProperty'的屬性。 ' – Rich 2012-08-14 09:36:39

4

嗯,我發現了一個解決方案,其中包括一個FormView,然而你並沒有指定是否適合你的場景。

無論如何,在我的情況下,DataBound-ed實體是我自己的dto(並非它應該很重要),訣竅是,當你更新formview時,你必須基本上附加在數據綁定前的事件, - 寫入空字符串爲空值,這樣的架構可以注入屬性值的構造的對象:

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),但然後可能是一級公民不是他們?