Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper way for datepickers validaton in c#? (windows forms)

Just can't get it with datepicker validation. I have datepicker From and datepicker To, so I want to prevent the user from doing some kung fu and seting datepicker From to be bigger than datepicker To, I've bumped across some questions but couldn't find the answer, so I've tried doing the easiest way I could think of:

Set MaxDate property for datepicker from in form_load event

private void Form1_Load(object sender, EventArgs e)
{
     datepickerFrom.MaxDate = datepickerFrom.Value;
}

Then do the same for value_changed event

private void datepickerFrom_ValueChanged(object sender, EventArgs e)
{
    datepickerFrom.MaxDate = datepickerFrom.Value;
}

This was easy and fine, only few lines of code, and I've only needed datepickerFrom_ValueChanged event, but recently I've tried typing date into datepicker insted of selecting it, and then all hell broke loose. So I came to some solution for validation, instead of setting MaxDate property, I've tried this.

private void dtFrom_ValueChanged(object sender, EventArgs e)
{        
    DateTime from = datepickerFrom.Value;
    DateTime to = datepickerTo.Value;
    int year= from.Year > to.Year ? to.Year : from.Year;
    int month = from.Month > to.Month ? to.Month : from.Month;
    int day = from.Day > to.Day ? to.Day : from.Day;
    int hour = from.Hour > to.Hour ? to.Hour : from.Hour;
    int minute = from.Minute > to.Minute ? to.Minute : from.Minute;
    int second = from.Second > to.Second ? to.Second : from.Second;
    //setting datepicker value
    datepickerFrom.Value = new DateTime(year, month, day, hour, minute, second);

}

This works fine, but feels like bit of headache, and I have to do this for datepickerTO_ValueChanged event also, sure I could make one method and call it two times, but still feels like there is a batter way for this, so any suggestions?

Thank you for your time

like image 334
Djordje Avatar asked Jan 10 '18 11:01

Djordje


2 Answers

Solution 1:

You can handle datePickerTo close event and do something like:

private void dateTimePickerTo_CloseUp(object sender, EventArgs e)
{
    DateTime fromdate = Convert.ToDateTime(dateTimePickerFrom.Value);
    DateTime todate1 = Convert.ToDateTime(dateTimePickerTo.Value);
    if (fromdate > todate1)
        //Error
}

You can also use DateTime.Compare whcih get two date like

int result = DateTime.Compar(dateTimePickerFrom.Value ,dateTimePickerTo.Value);

if result is 1 means From date is earlier, see this link.

Note1:

but as you said if user type in From or To textboxes then closeup event never fire so you need compare them in where you want to process such as button click.

Note2:

As @Sinatr comment if Value is DateTime then don't need to convert it so the code would be like:

 if (dateTimePickerFrom.Value >dateTimePickerTo.Value)
        //Error
like image 180
Aria Avatar answered Oct 11 '22 04:10

Aria


Your proposal would lead to a horrible interface. Suppose the following case:

From = 1 jan 2000
To = 1 feb 2000

User wants to change both values to 2010. He starts with the from value:

From = 1 jan 2010

Now he wants to change the TO value to 1 feb 2010. Alas, he can't.

Proper usage would be: add some button with which the operator can affirm he has changed all data, start checking it and update. In windows this button is usually named Apply Now or OK. Why deviate from this windows standard.

private void OnFormLoading(object sender, ...)
{
    this.FromDate.MinValue = ... // use the real absolute min value you want ever to allow
    this.FromDate.MaxValue = ...;
    this.ToDate.MinValue = ...;
    this.ToDate.MaxValue = ...;
}

Don't do any checking as long as the operator is making changes. Strat checking the input values when he indicates that he finished making changes:

private void OnButtonApplyNow_Clicked(object sender, ...)
{
    bool InputOk = CheckInput();
    if (!inputOk)
    {
         ShowIncorrectInput(); // for instance using a MessageBox
    }
}
like image 45
Harald Coppoolse Avatar answered Oct 11 '22 06:10

Harald Coppoolse