2012-03-20 4 views
4

私のプログラムでは、DateTimePickerのValue changedイベントを使用していますが、矢印をクリックしたときにValueChangedイベントが発生したり、値がプログラマチックに変更された場合は、ユーザーのDateTimePicker(値がプログラムによって変更されたときではない)、これを行う方法はありますか?ユーザーがDateTimePickerコントロールと対話するときに発生するイベントは何ですか?

+0

質問は不明です。文章を拡大したり修正したりして、あなたが望むものを明確に理解できますか? – Mathieu

+0

'Click'イベントを探してください...これはやってみたいという奇妙なことです。 –

+0

私は同じ問題に直面していますが、デモwinformsアプリケーションを単独のdatetimepickerで作成し、矢印/カレンダーアイコンをクリックするとイベントは発生しません。期待どおりに異なる日付が変更された場合にのみ発生します。だから私はまだ見つけることができませんでしたが、コードのどこかに値を手動で設定しなければならないという問題があります。 – Veverke

答えて

4

はい、MSDN documentationをご覧ください。特に、あなたがこのイベントを使用してコントロールを配線する必要がありますOnValueChangedイベント

:コンストラクタメソッドで

dateTimePickerControl.ValueChanged += new EventHandler(picker_ValueChanged); 

そして、ここでは、メソッドのシグネチャである:

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

これはデザイナーからも行うことができます。 Properties、Eventsの部分に行くと、すべてのイベントが表示されます。ちょうどダブルクリックすれば、メソッド署名と配線が作成されます。

YOUR 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

ジャスティンは答えてくれてありがとうございますが、このイベントは両方の状況で起きます(ユーザーが変更したときやプログラムによって変更されたとき)。ユーザーがDateTimePickerの値を変更したときのみ識別する方法はありますか? – user1157690

+0

プログラムで変更する前にオンにしてから、イベントで常にオフにすることができるグローバルブール値を持つことができますか?グローバルは偉大なプログラミングの練習ではありませんので、あなたは本当にこの機能が必要だと思うようにしてください:)ここでは、そのような行に沿ってすでに質問されているので:http://stackoverflow.com/questions/2806601/how-to-distinguish-ユーザー - 対 - プログラム - 変更 - winforms - チェックボックス –

+0

私は実行する必要があるものを反映するためにコードを更新しました –

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イベントを防止します。

同じ概念を使用して、イベントを発射せずに、プログラムの日付を変更するには:

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

あなたは、ユーザーが変更を行った際に知っておくDateTimePickerから派生することができます

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

ときFormDateTimePickerUserを使用すると、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の例と似ていますが、フラグを自分で設定する必要はありません。このコントロールを使用するだけです。

関連する問題