Null Dates in Webforms, How?


Author
Message
Cyrus Welch
Cyrus Welch
StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)
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
Peter Jones
Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)Advanced StrataFrame User (520 reputation)
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
S
StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)
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
Greg McGuffey
Strategic Support Team Member (3.5K reputation)
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
Cyrus Welch
StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)
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
S
StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)
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
Greg McGuffey
Strategic Support Team Member (3.5K reputation)
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
S
StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)StrataFrame Developer (4.7K reputation)
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
Greg McGuffey
Strategic Support Team Member (3.5K reputation)
Group: Forum Members
Posts: 2K, Visits: 6.6K
Got it, thanks!
Cyrus Welch
Cyrus Welch
StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)StrataFrame Beginner (44 reputation)
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.

GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Similar Topics

Reading This Topic

Login

Explore
Messages
Mentions
Search