开发者

Binding a nullable int to an asp:TextBox

开发者 https://www.devze.com 2022-12-24 12:43 出处:网络
I have a property int? MyProperty as a member in my datasource (ObjectDat开发者_开发知识库aSource). Can I bind this to a TextBox, like

I have a property int? MyProperty as a member in my datasource (ObjectDat开发者_开发知识库aSource). Can I bind this to a TextBox, like

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

Basically I want to get a null value displayed as blank "" in the TextBox, and a number as a number. If the TextBox is blank MyProperty shall be set to null. If the TextBox has a number in it, MyProperty should be set to this number.

If I try it I get an exception: "Blank is not a valid Int32".

But how can I do that? How to work with nullable properties and Bind?

Thanks in advance!


Well i've found a solution, which includes a FormView however and you don't specify if that fits your scenario.

Anyhow, in my case the DataBound-ed entity is a dto of my own (not that it should matter) and the trick is that when you update the formview you have to essentially attach on the pre-databound event and re-write the empty string as a null value so that the framework can property inject the value to the constructed object:

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

and similarly on insert

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

what makes this really fun is the fact that the error message ( is not a valid Int32) is actually wrong and it should write ( is not a valid Nullable) but then nullables would have been first class citizens wouldn't they?


I'm starting to believe it's not possible to bind a nullable value property. Til now I only can see the workaround to add an additional helper property to bind a nullable type:

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

and then bind the helper property to the TextBox instead of the original:

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

I'd be happy to see another solution.


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

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

You could use HasValue to determine if the nullable type is null, and then set the Text property.

0

精彩评论

暂无评论...
验证码 换一张
取 消