I am working on a Windows Form that uses a good amount of DateTimePicker controls.
As per spec, the controllers need to show 'no date' initially till user manually selects a date.
As per the DateTimePicker functionality, we cant assign 'nothing' as a value.
So what we do is set a default minimum date, and then change the custom format of the control to "", to give the illusion of an empty field.
A quirk we have found is that when the user clicks on the DateTimePicker and selects a new date for the first time, his initial click does not dismiss the calendar. So instead the calendar persists, and the user has to manually click outside the control to dismiss the calendar.
To make the user experience slightly worse, while in this state the calendar is immune to any further date selection. So the date selection is stuck with the initially selected date, and the user needs to click out.
Once a date has been selected by the control, selecting a new date dismisses the calendar as expected.
My best guess would be that it would have something to do with the custom format that is there originally, which causes a hiccup with the control when a new properly formatted date is selected.
I am trying to find a way to 'force' the calendar to dismiss if open on value change, but I am not finding the way to do this.
I have even tried to set focus elsewhere on value change, but no luck either.
Has anybody else experienced this behavior and/or know of a way around it?
Thanks!
Some of the code-----------
//if dateTime property has not been saved, then call ClearDateTime on the controller, else display the saved value.
public static void ClearDateTime(DateTimePicker dtp)
{
dtp.Value = DateTime.Today.AddDays(-1);
//set the format
dtp.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
// set custom format to empty
dtp.CustomFormat = " " ;
}
// When value is changed/date is selected
private void DateTimePicker_ValueChanged(object sender, EventArgs e)
{
MainFormUtilities.ShowDateTime(this.DateTimePicker);
this.LockFormDown();
}
public static void ShowDateTime(DateTimePicker dtp)
{
dtp.Format = System.Windows.Forms.DateTimePickerFormat.Long;
}
Essentially you need to manually raise the CloseUp event, please refer to the solutions here, How can I programmatically close the dropdown calendar of a datetimepicker or update the dropdown calendar to reflect the .Value property?.
I had a similar situation where a client insisted on having the field show no date (appear blank). I gave up on trying to hack the standard .NET DateTimePicker and used the DevExpress DateEdit control which does allow a blank value.
The solution I have pursued that was most practical for my project was the suggestion by Reniuz, to use a checkbox to control the values and behaviour of the DateTimePicker.
If a user wants to add a date, he selects the checkbox which enables the Picker and defaults to todays date.
If he wants to clear the date (ie not submit a date after all) he unchecks the checkbox which clears the picker with a empty format and we save nothing to the database.
If I had the points I would upvote all the other suggestions. They were helpful, but this solution seemed to be the practical path for us. Thanks to all again!
Related
I have a DatePicker which displays the date only and a separate TextBox that displays the time. Both elements use TwoWay binding.
My issue is that when ever I adjust the date using the DatePicker, my time resets to 00:00. Is there a way to disable this behavior and leave the TimeOfDay alone? I can't seem to find an answer anywhere.
I know I could grab the time with a GotFocus event and then manually restore, but it seems messy.
The DatePicker and TextBox should be bound to two different source properties, a DateTime? and a TimeSpan respectively.
The built-in DatePicker control selects only a date without any specific time so it makes no sense to try to display the time of the selected date in a TextBox.
Without place a TextBox over a Calendar control and hiding/showing controls and synchronizing values between controls, is it possible to have a Textbox and a button next to it, that when clicked, shows the calendar dropdown?
I would use the DateTimePicker control, however I want to set the value to NULL without having to show & use the checkbox.
I also want that the control is empty without any default date which is grayed out.
Implementing a custom control based on this answer is trivial, but I was wondering if a calendar dropdown can be shown without the need to have a hidden DateTimePicker.
This is pretty much the definition of a DateTimePicker...
In datetime picker control the user has to press .(period) to move to different fields (like day, month year)
I want to override this behaviour by allowing the user to enter date without entering .(period)
Is there any to achieve this programmatically in C# winforms?
Thanks in advance.
Not very beautiful code but you could of course send the . automatically.
Just handle the ValueChanged event (which will only be called when the user has entered a "whole" value for date part he's currently editing) and in the event handler you add the code SendKeys.Send(".");.
I've been working in silverlight to do a date-oriented application. I started off with changing the calendar template to contain a listbox on every date, and I created a listbox containing simple items.
I implemented an easy drag drop on both those elements, so now I can drag from the listbox containing the items to the listbox on a date and have an event.
Downside is: In the event, I don't know which date it was dropped to.
How can I figure this out?
Please note: The date dropped to is not necessarily the date currently selected...
As it turns out, using a different drag drop implementation (http://silverlightdragdrop.codeplex.com/) got me to the date relatively easy:
DateTime datetime = (DateTime)((DropTarget)sender).DataContext;
All thanks for viewing and thinking...
I am making a program that will help people "book" orders for a department in C#. They need to be able to choose multiple dates in different months.
I would prefer to have it so they can click a date, and then shift click another one to select all dates between those two, and control clicking as well, to do single selection/deselection. They have to be able to move between months while still retaining all the dates they clicked for the previous month, this way they can overview the dates they've selected to make it easier.
What is the best way to do this? Should I use Visual Studio's default month calendar or is there a more flexible one that exists?
You can make it work by detecting clicks on dates and then add or remove the clicked date from the bolded dates. Implement the MonthCalendar's MouseDown event:
private void monthCalendar1_MouseDown(object sender, MouseEventArgs e) {
MonthCalendar.HitTestInfo info = monthCalendar1.HitTest(e.Location);
if (info.HitArea == MonthCalendar.HitArea.Date) {
if (monthCalendar1.BoldedDates.Contains(info.Time))
monthCalendar1.RemoveBoldedDate(info.Time);
else
monthCalendar1.AddBoldedDate(info.Time);
monthCalendar1.UpdateBoldedDates();
}
}
Just one problem with this, it flickers like a cheap motel. No fix for that.
The WinForms MonthCalendar supports selection of a Range, from Start to End but not the (de)selection of individual dates with Ctrl. So it seems it does not meet your requirements.
Just a quick note: If you resize the MonthCalendar it will show more months. Together with nobugz' answer that might give you a working solution.
Assuming that you are using WPF...
I would recommend that you create a simple ListBox and bind the ItemsSource property to the Calendar's SelectedDates property. As the user selects and deselects days from the Calendar, they will be added to or removed from the list.
In addition, you could create a DateSpan class and a ValueConverter to group dates in a series into your DateSpan class. You could then apply the converter to the SelectedDates property so that when the user uses Shift-Select, they will see a date span rather than a bunch of dates (assuming that's a bad thing). The logic wouldn't be too complex.
There are plenty of third-party tools out there, but no matter which control you use the core problem will remain: you want the user to be aware of all selected items, but you don't want to show every single month that contains a selected day at the same time. The best answer I can think of would be a list.