Cyrus Welch
|
|
Group: Forum Members
Posts: 20,
Visits: 82
|
How do I properly use null dates in a webforms application? When working with null dates I get data binding errors on postbacks. We use nulls to at least have a nominally empty date field but can't seem to get it to work in webforms. I searched mutiple times and can't find any references to what the best way to do it so that customers won't see a date when entering data if the field is not supposed to have a date in it yet. I've tried the return alternate using #1/1/1800# and then that shows in the textbox on the screen, I could live with the return alternate concept if it just didn't show in textboxes and listviews. Is there an easy way to do this or do I need to not bind the data and handle it myself? (which is what I'm trying to avoid).
|
|
|
Peter Jones
|
|
Group: Forum Members
Posts: 386,
Visits: 2.1K
|
Hi Cyrus, You may have already done this but, if not, try a search for "null date" in all forum posts. From memory this has come up quite a number of time in the past - maybe the answer you want is in the archives. Cheers, Peter
|
|
|
StrataFrame Team
|
|
Group: StrataFrame Developers
Posts: 3K,
Visits: 2.5K
|
Since a DBNull.Value cannot be cast to a DataTime, you must return an alternate date through the property. If you are binding the value to a textbox or displaying it in a listview, then that alternate date is going to display. In order for the alternate date to not display within a textbox, you will need to create your own inherited textbox and change the display when the alternate value is returned. For the value within a listview, you will need to change the column displaying the value to PopulatedThroughEvent rather than using FormattedString; this will allow you to programmatically set the value for the column through the RowPopulating event of the list view.
|
|
|
Greg McGuffey
|
|
Group: Forum Members
Posts: 2K,
Visits: 6.6K
|
Ben,
What event should you handle (override) in the inherited textbox to handle this issue?
|
|
|
Cyrus Welch
|
|
Group: Forum Members
Posts: 20,
Visits: 82
|
Greg McGuffey (01/04/2008) Ben,
What event should you handle (override) in the inherited textbox to handle this issue?Yeah, what he said! I'm willing to do that, but I do need to know which event would be best to do this. I can't have the users seeing the 1/1/1800 value. I know it may take a little more work to handle the situation for the .net gridview which we use because we get paging and such. I guess what your saying is that the value involved both ways must be a valid date or there are problems? I can live with that I guess as long as I can figure out how to inherit the textbox and change it both ways on the fly.
|
|
|
StrataFrame Team
|
|
Group: StrataFrame Developers
Posts: 3K,
Visits: 2.5K
|
You'll want to create your own property on the TextBox, say "Value" or "MyText" (something other than Text since it's already taken). Make that property a DateTime property and that property will then be used for your binding (so, bind the business object to that property, not the Text property. In the Get of that property, if the Text is empty, then return 1/1/1800, if the text has a date, then use DateTime.Parse() to get the DateTime value from the Text and return it. Then, in the Set of the property, if the value is 1/1/1800, set the text to String.Empty. Otherwise, set the Text to value.ToString("MM/dd/yyyy") (where the MM/dd/yyyy is the format you want the dates to appear in). Luckally, WebForms binding is much simpler than WinForms binding, so you won't have to worry about creating all of those changed and changing events to get the data to bind properly.
|
|
|
Greg McGuffey
|
|
Group: Forum Members
Posts: 2K,
Visits: 6.6K
|
So, in WinForms, you'd also need to add the changing/changed events to get this to work. Anything else to get to work with a WinForms control?
|
|
|
StrataFrame Team
|
|
Group: StrataFrame Developers
Posts: 3K,
Visits: 2.5K
|
Ah, for WinForms, when you add a bindable property, you also have to add a "Changed" event that corresponds to the bindable property and it has to have the same signature as EventHandler: Public Event MyTextChanged As System.EventHandler '-- Your property is named "MyText" You then raise this event when the property changes so that the binding knows to copy the new data back to the data source. The "Changing" event isn't needed by the binding, but sometimes it's nice to have; I would only add it when you need it.
|
|
|
Greg McGuffey
|
|
Group: Forum Members
Posts: 2K,
Visits: 6.6K
|
|
|
|
Cyrus Welch
|
|
Group: Forum Members
Posts: 20,
Visits: 82
|
Ben Chase (01/11/2008)
You'll want to create your own property on the TextBox, say "Value" or "MyText" (something other than Text since it's already taken). Make that property a DateTime property and that property will then be used for your binding (so, bind the business object to that property, not the Text property. In the Get of that property, if the Text is empty, then return 1/1/1800, if the text has a date, then use DateTime.Parse() to get the DateTime value from the Text and return it. Then, in the Set of the property, if the value is 1/1/1800, set the text to String.Empty. Otherwise, set the Text to value.ToString("MM/dd/yyyy") (where the MM/dd/yyyy is the format you want the dates to appear in). Luckally, WebForms binding is much simpler than WinForms binding, so you won't have to worry about creating all of those changed and changing events to get the data to bind properly. Ok, I know this may rather basic, but I can't figure out how to easily subclass the control to do this. Sometimes I wonder why I'm doing this, as subclassing a control like this was so easy to do in VFP. Do I actually need to create a composite control in it's own assembly to be able to do this? I just want to create a user control and be done, but I can't find any references to how to do this and be able to actually use the control like a normal control.
|
|
|