2016-07-14 24 views
0

DateTimePicker(WinForms)アプリケーションでどのコントロール(日、月、年)が選択(強調表示)されているかを調べようとしています。どのコントロールが選択されているかを示すプロパティはありますか?もしそうなら、コントロールの値だけを別のコントロールからプログラムで変更することはできますか?C#DateTimePickerフォーカスフィールドを取得

DateTimePickerの集中管理を行う方法はありますか?

+0

最終目標は何ですか? Valueプロパティを更新して、あなたが望むものを達成することができますか?どのコントロールがコンポジットコントロール内でフォーカスを持っているかを判断する方法を思い出しているようですが、私は何も触れていないので、空白を描いています。 – senfo

+0

目標は、DateTime単一値を変更することです(DateTimePickerで1つの列を選択し、キーボードで新しい値を入力するのと同じです)。しかし、私はシステムキーボードを使いたくない。 DateTimePickerのフォーカスされた子コントロールを参照するいくつかのプロパティがあると思っていましたが、@Erikestの下には記載されていません –

+0

複合コントロール内でどのコントロールにフォーカスがあるかを判断する方法は、IMessageFilterとして何かを意味しますか? –

答えて

2

短い回答:いいえ、簡単にはありません。

DateTimePickerは基本的にSysDateTimePick32のラッパーで、ShowUpDownがtrueに設定されているときにどの子ウィンドウが選択されたかを判断するのに使いやすいプロパティは公開されません。そのソースコードにプライベートメンバーがいなくても、基本的に基本的なCOMコントロールに物事を転送するだけです。UnsafeNativeMethods.SendMessage

1つの方法は、変更。ここにサンプルがあります。新しいwinformsアプリケーションを作成し、DateTimePicker、Label、およびButtonを追加します。その後、usingステートメントの後にform1.csに以下のコードをコピーします。

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public enum DatePart 
     { 
      YEAR, 
      MONTH, 
      DAY 
     } 

     public DatePart part { get; set; } 
     private DateTime previous { get; set; } 
     private bool checkSelectedPart { get; set; } 


     public Form1() 
     { 
      InitializeComponent(); 


      dateTimePicker1.ValueChanged += DateTimePicker1_ValueChanged; 
      dateTimePicker1.KeyPress += DateTimePicker1_KeyPress; 
      previous = dateTimePicker1.Value; 

     } 

     private void DateTimePicker1_KeyPress(object sender, KeyPressEventArgs e) 
     { 

     } 

     private void DateTimePicker1_ValueChanged(object sender, EventArgs e) 
     { 
      if (checkSelectedPart) 
      { 
       var dtp = sender as DateTimePicker; 
       TimeSpan change = (dtp.Value - previous); 
       var dayChange = Math.Abs(change.Days); 
       if (dayChange == 1) 
        part = DatePart.DAY; 
       else if (dayChange >= 365) 
        part = DatePart.YEAR; 
       else 
        part = DatePart.MONTH; 

       previous = dtp.Value; 

       label1.Text = part.ToString(); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      checkSelectedPart = true; 
      dateTimePicker1.Focus(); 
      SendKeys.SendWait("{UP}"); 
      SendKeys.SendWait("{DOWN}"); 
      checkSelectedPart = false; 
      button1.Focus(); 
     } 
    } 
} 
+0

私はそれがこのように作られていることを心配していました。ご回答有難うございます。 –

+0

キーアップを送信し、キーダウンを送信してValueChangedイベントをチェックして、TimesPanを見て日付のどの部分がcurrentDateからpreviousDateを引いたかを確認することで、日付の変更を追跡できます。私は答えを修正しました。これを行う方法のサンプルが含まれています – Erikest

+0

本当に素敵な解決策は、私がメッセージフィルタを作成することから救ったか、UIを混乱させることです。どうもありがとう –

関連する問題