2011-08-17 7 views
10

winforms .netのdatetimepickerコントロールにチェックボックスがあります。 しかし、チェックボックスをオンまたはオフにしたときにトリガーされるイベントが見つかりませんでした。 退出はありますか? 「チェックする」場合you'llが決定することができるので、datetimepickerの入手方法c#winformチェック/未チェックイベント

+0

ここをクリックhttp://social.msdn.microsoft.com/Forums/en-US/winforms/thread/27dd3141-5dfb-439e-8e30-e051a019303a/ – V4Vendetta

答えて

2

You'll変更値が古いを保存する必要がトリガーんが、新しいものに比較するために、値を「確認しました」状態が変更されました:

bool oldDateChecked = false; //if it's created as not checked 

private void dtp_filtro_date_ValueChanged(object sender, EventArgs e) 
{ 
    if (this.dtp_filtro_date.Checked != oldDateChecked) 
    { 
     oldDateChecked = this.dtp_filtro_date.Checked; 
     //do your stuff ... 

    } 
} 
10

それはしかし、イベント

+2

コードでCheckedプロパティが設定されていない限り、 –

2

同じ問題が発生しました。私は、WinFormsのDateTimePickerコントロールでCheckedChangedEventが必要でした。だから私の前に答えのインスピレーションを得て、私はこのイベントを実装するDateTimePickerから継承した、DateTimePicker2という名前の継承されたユーザーコントロールを作成しました。それは動作するように見えますが、保証はありません。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 
    public partial class DateTimePicker2 : DateTimePicker 
    { 
     private bool _checked; 

     public new bool Checked 
     { 
      get 
      { 
       return base.Checked; 
      } 
      set 
      { 
       if (value != base.Checked) 
       { 
        base.Checked = value; 
        _checked = base.Checked; 
        OnCheckedChanged(new CheckedChangedEventArgs { OldCheckedValue = !value, NewCheckedValue = value }); 
       } 
      } 
     } 

     public event CheckedChangedEventHandler CheckedChanged; 

     public DateTimePicker2() 
     { 
      InitializeComponent(); 
      _checked = Checked; 
     } 


     protected virtual void OnCheckedChanged(CheckedChangedEventArgs e) 
     { 
      if (CheckedChanged != null) CheckedChanged(this, e); 
     } 

     private void DateTimePicker2_ValueChanged(object sender, EventArgs e) 
     { 
      if (Checked != _checked) 
      { 
       _checked = Checked; 
       CheckedChangedEventArgs cce = new CheckedChangedEventArgs { OldCheckedValue = !_checked, NewCheckedValue = _checked }; 
       OnCheckedChanged(cce); 
      } 
     } 
    } 

    public delegate void CheckedChangedEventHandler(object sender, CheckedChangedEventArgs e); 

    public class CheckedChangedEventArgs : EventArgs 
    { 
     public bool OldCheckedValue { get; set; } 
     public bool NewCheckedValue { get; set; } 
    } 

} 

オフコースでは、デザイナーからのDateTimePicker2_ValueChangedイベントの購読を忘れないようにしてください。

  1. base.Checkedプロパティにはないので、私は、以前の値のトラックを保つために_checkedフィールド(base.Checked 1を非表示にする)新しいCheckedプロパティの両方を使用する理由は、ありますプログラムで変更されたときにValueChangedイベントが発生し、そのために新しいプロパティが必要になりました。
  2. this.Checked新しいプロパティは、UIから変更されたときにValueChangedイベントを発生させないため、base.Checkedプロパティを追跡するフラグが必要です。

基本的に両方のアプローチの組み合わせが必要でした。

こちらがお役に立てば幸いです。

+0

良いと簡単な解決策。ファッション2017に従ってそれを作るには、デリゲートの代わりに 'event EventHandler 'を使用してください。イベントを呼び出すには 'this.CheckedChanged?.Invoke(this、e)'を使用します。さらに、コンストラクタの 'ValueChanged'にサブスクライブします:' this.ValueChanged + = DateTimePicker_ValueChanged'。この方法で、誰もこのクラスが適切に機能しないようにすることはできません。新しいCheckedがプログラム的な変更のために呼び出され、ValueChangedイベントが演算子の変更中に発生します。 –

0

私はこれが超古いことを知っていますが、これは誰かを助けることができます。

あなたはまた、チェックボックスを活性化できるスペースキープレスを取得するためにKeyUpイベントで同じことを行う必要がありますDataTimePicker.MouseUpイベント

private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (((DateTimePicker)sender).Checked) 
     { 
      //Do whatever you need to do when the check box gets clicked 
     } 
     else 
     { 
      //Do another stuff... 
     } 
    } 

をキャプチャすることができます。

関連する問題