2011-05-16 4 views
1

사용자가 "시간 블록"을 설정할 수있는 간단한 대화 상자가 있습니다. 사용자는 블록의 지정된 시작 시간을 표시 한 다음 지속 시간을 입력하거나 블록의 종료 시간을 입력 할 수 있습니다. 예를 들어 오전 8시에 시작, 오전 11시에 끝나거나 오전 8시에 시작하여 180 분 동안 시작할 수 있습니다. 나는 기간 동안 텍스트 상자와 끝 시간에 대한 DateTimePicker를 가지고있다. DateTimePicker의 사용자 정의 형식은 "hh : mm tt"입니다. 텍스트 상자가 잘 작동합니다. Text Box의 Leave 이벤트에서 DateTimePicker를 올바른 종료 시간으로 업데이트합니다.DateTimePicker Leave/ValueChanged 이벤트

그러나 DateTimePicker를 작동시키는 것이 거의 쉬운 일은 아닙니다. Leave 이벤트가 발생하면 DateTimePicker의 값이 항상 올바른 것은 아닙니다.

또한 시간 블록의 지속 시간이 15 분 이상이어야하므로 이상적으로 사용자가 컨트롤을 "나가기"를 할 때 다른 컨트롤을 업데이트 할 수 있으며, 적어도 15 분. (< 15 일 경우 15로 설정). 일부 코드에 대한

좋아, 시간 :

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)); 
} 

여기의 차이입니다. 날짜 시간 선택 도구의 시간이 07:00 PM으로 설정된 것으로 가정하십시오. 사용자가 "07"을 강조 표시하고 6을 입력 한 다음 Tab을 누르면 Leave 이벤트가 ValueChanged 이벤트보다 먼저 발생합니다. 사용자가 06과 Tab을 입력하면 이벤트는 역순으로 진행됩니다. 그래서 어느 쪽의 이벤트도 마지막 이벤트가 될 수는 없습니다. ValueChanged 이벤트가 발생할 때마다 업데이트 (업데이트 할 수 없음)하고 싶지 않습니다. 최소 지속 시간 요구 사항으로 인해 편집하려는 사용자가 실제로 혼란 스러울 수 있기 때문입니다.

도움 말?

답변

0

퇴장하기 전에 컨트롤의 유효성을 검사해야합니다. m_DateTimePickerEndTime에서 텍스트 상자로 이동할 경우 this.Focus()를 사용하여 모든 컨트롤의 유효성을 검사 할 수 있습니다.

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

탭 순서가 다른 경우 this.Focus를 다른 이탈 이벤트에 넣으십시오.

관련 문제