开发者

DateTimePicker Leave / ValueChanged events

开发者 https://www.devze.com 2023-03-06 20:12 出处:网络
I have a simple little dialog that lets user setup a \"time block\".The user indicates the specified start time for the block, and then can either enter a duration, or enter the end-time for the block

I have a simple little dialog that lets user setup a "time block". The user indicates the specified start time for the block, and then can either enter a duration, or enter the end-time for the block. For example, they can either say start at 8AM, end at 11AM, or start at 8AM and duration of 180 minutes. I have both a Text Box for the duration, and a DateTimePicker for the end time. The DateTimePicker's custom format is "hh:mm tt". The Text Box works just fine开发者_高级运维. On the Leave event of the Text Box, I update the DateTimePicker with the correct end time.

However, getting the DateTimePicker to work is not nearly as easy. The DateTimePicker doesn't always have its value correct when the Leave event fires.

Also, I have a requirement to make sure the duration of the time block is at least 15 minutes, so ideally, when the user "Leaves" either control, I can update the other control, and also validate that its at least 15 minutes. (If < 15, I set it to 15).

Ok, time for some code:

private void SetDuration(int Duration)
{
    Duration = Math.Max(15, Duration);
    m_TextBoxDuration.Text = Duration.ToString();
    m_DateTimePickerEndTime.Value = m_DateTimePickerStartTime.Value.AddMinutes(Duration);
}

private void m_TextBoxDuration_Leave(object sender, EventArgs e)
{
    int duration = 0;
    int.TryParse(m_TextBoxDuration.Text, out duration);
    SetDuration(duration);
}

private void m_DateTimePickerEndTime_Leave(object sender, EventArgs e)
{
    SetDuration((int)(m_DateTimePickerEndTime.Value.Subtract(m_DateTimePickerStartTime.Value).TotalMinutes));
}

Here's the difference. Suppose the date time picker has its time set to 07:00 PM. If the user highlights the "07" and types 6 then hits Tab, the Leave event fires before the ValueChanged event. If the user types 06 and then Tab, the events go in reverse order. So I cannot rely on either event to be the final event. I don't want to (can't) update every time I get the ValueChanged event, because then the minimum duration requirement can really mess with the user trying to make edits.

Help?


You need to validate the control first, before leaving. If you tab from m_DateTimePickerEndTime to the textbox, you can use this.Focus() to validate all the controls.

private void m_DateTimePickerEndTime_Leave(object sender, EventArgs e)
{    
  this.Focus();      
  SetDuration((int(m_DateTimePickerEndTime.Value.Subtract
          (m_DateTimePickerStartTime.Value).TotalMinutes));    
}

If your tab order is different, put the this.Focus in the other leave event.

0

精彩评论

暂无评论...
验证码 换一张
取 消