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.
精彩评论