2012-03-20 3 views
4

저는 C#에서 새 프로그램입니다. DateTimePicker 값 변경 이벤트를 사용하지만 사용자가 화살표를 클릭하거나 값이 프로그래밍 방식으로 변경되면 ValueChanged 이벤트가 발생합니다. 사용자의 상호 작용 만 식별하려고합니다. DateTimePicker (값이 프로그래밍 방식으로 변경되지 않은 경우),이를 수행 할 수있는 방법이 있습니까?사용자가 DateTimePicker 컨트롤과 상호 작용할 때 발생하는 이벤트는 무엇입니까?

+0

질문이 명확하지 않습니다. 문장을 확장하거나 교정하여 원하는 것을 명확히 할 수 있습니까? – Mathieu

+0

'Click' 이벤트를 찾으십시오 ...하지만 이것은 이상한 일입니다. –

+0

동일한 문제에 직면하고 있지만 datetimepicker 하나만 사용하여 데모 winforms 앱을 만들고 화살표/캘린더 아이콘을 클릭하면 이벤트가 시작되지 않습니다. 예상대로 다른 날짜가 변경된 경우에만 해고됩니다. 그래서 문제는 아직 찾을 수 없었지만 코드의 어딘가에서 수동으로 값을 설정해야합니다. – Veverke

답변

4

예, MSDN documentation을 살펴보십시오. 특히, OnValueChanged 이벤트

당신은이 이벤트를 사용하여 컨트롤을 연결할 필요가

: 생성자 방법

을 :

void f_ValueChanged(object sender, EventArgs e) 
    { 
     //Do whatever you need when the value changes here 
    } 
: 여기

dateTimePickerControl.ValueChanged += new EventHandler(picker_ValueChanged); 

그리고는 메소드 서명입니다

디자이너 에게서도이 작업을 수행 할 수 있습니다. 등록 정보, 이벤트 부분으로 가면 모든 이벤트가 나열됩니다. 더블 클릭하면 메소드 서명과 배선이 생성됩니다.

이 클래스

에서 전역 변수를 만들기 : 당신의 UPDATE TO

UPDATE는

특별히이이 프로그램의 변화인지 여부를 확인하고 싶은 경우에, 당신은 이런 일을하고 싶지

Boolean isProgrammaticEvent = false; 이벤트 배선에서

isProgrammaticEvent = true; 
    //Change picker value 

:

프로그래밍 방식 변경 전

void f_ValueChanged(object sender, EventArgs e) 
    { 
        Boolean isThisProgrammatic = isProgrammaticEvent; 
        isProgrammaticEvent = false; 
        if(isThisProgrammatic) 
            return; 
        //Do whatever you need when the value changes here 
    } 
+0

Justin은 답변을 주셔서 감사하지만이 이벤트는 두 가지 상황에서 나타납니다 (사용자가 변경하거나 프로그램 방식으로 변경 한 값). 사용자가 DateTimePicker의 값을 변경하는 경우에만 식별 할 수있는 방법이 있습니까 – user1157690

+0

방법이 있다고 생각하지 않지만 프로그래밍 방식으로 변경하기 전에 켤 수있는 전역 부울 값을 가질 수 있으며 이벤트가 항상 꺼지게 할 수 있습니까? 전역은 훌륭한 프로그래밍 실습이 아니므로이 기능이 실제로 필요하다는 것을 생각해보십시오. :) 다음은이 행에 대한 질문입니다. http://stackoverflow.com/questions/2806601/how-to-distinguish- 사용자 - 대 - 프로그래밍 - 변경 - winforms - 체크 박스 –

+0

내가해야 할 일을 반영하도록 코드를 업데이트했습니다. BTW –

8

당신은 DropDown 이벤트에 이벤트 핸들러를 해제 할 수 있으며, 회전 드롭 다운 캘린더가 닫힐 때 다시 돌아옵니다. CloseUp 경우에 사용자는 :

private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { 
    this.Text = dateTimePicker1.Value.ToString(); 
} 

private void dateTimePicker1_DropDown(object sender, EventArgs e) { 
    dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; 
} 

private void dateTimePicker1_CloseUp(object sender, EventArgs e) { 
    dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; 
    dateTimePicker1_ValueChanged(sender, e); 
} 

이것은 사용자가 드롭 다운 동안 일정을 스크롤하는 동안 발사에서 ValueChanged 이벤트를 방지 할 수 있습니다.

class DateTimePickerUser : DateTimePicker 
{ 
    private bool userSetValue; 
    public bool UserSetValue 
    { 
     get 
     { 
      return userSetValue; 
     } 
    } 

    public DateTimePickerUser() 
    { 
     userSetValue = true; 
    } 

    public new DateTime Value 
    { 
     get 
     { 
      return base.Value; 
     } 
     set 
     { 
      userSetValue = false; 
      base.Value = value; 
      userSetValue = true; 
     } 
    } 
} 

을 : 사용자가 변경 한 때를 알고

private void ProgramChangesDateTime(DateTime dt) { 
    dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; 
    dateTimePicker1.Value = dt; 
    dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; 
} 
0

당신은 DateTimePicker에서 파생 할 수 있습니다

사용, 이벤트를 해고하지 않고 동일한 개념을 날짜를 프로그래밍 방식으로 변경하려면 Form에서 DateTimePickerUser을 사용하면 ValueChanged 이벤트의 플래그를 확인하기 만하면됩니다.

private void dateTimePickerUser1_ValueChanged(object sender, EventArgs e) 
    { 
     if (dateTimePickerUser1.UserSetValue) 
      this.Text = "User changed value."; 
     else 
      this.Text = "Code changed the value."; 
    } 

이것은 Justin Pihony의 예와 비슷하지만 플래그를 직접 설정할 필요는 없으며이 컨트롤을 사용하기 만하면됩니다.

관련 문제