2016-07-14 150 views
0

我試圖確定在DateTimePicker(WinForms)應用程序中選擇(突出顯示)哪個控件(日,月,年)。是否有屬性,用於指示選擇哪個控件?如果是這樣,我可以通過編程從另一個控件更改控件的值嗎?C#DateTimePicker獲取焦點字段

有沒有辦法獲得DateTimePicker的集中控制?

+0

您的最終目標是什麼?你能通過更新Value屬性來完成你想要的嗎?我似乎想起了一種方法來確定哪個控件集中在一個複合控件中,但我畫了一個空白,因爲我已經觸摸了WinForms中的任何東西已經有好幾年了。 – senfo

+0

目標是更改DateTime單個值(與我在DateTimePicker中選擇一列並在鍵盤上鍵入新值相同)。但是,我不想使用系統鍵盤。 我希望會有一些財產指的是集中的DateTimePicker的子控件,但是沒有如下所述的@Erikest –

+0

確定哪個控件具有焦點在複合控件中的方式,你的意思是IMessageFilter的意思嗎? –

回答

2

簡答:不,不容易。

DateTimePicker基本上是一個SysDateTimePick32的包裝,並且沒有公開任何易於使用的屬性來確定當ShowUpDown設置爲true時選擇哪個子窗口。它甚至沒有使用它的源代碼中的私有成員 - 它基本上只是將東西轉發到底層的com控件,ala UnsafeNativeMethods.SendMessage

一種方法是先發送一個然後檢查哪個部分變化。這是一個示例。創建一個新的winforms應用程序,然後添加一個DateTimePicker,標籤和按鈕。之後,在使用語句之後,將以下代碼複製到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

你可以做的一件事情是通過發送一個關鍵字後跟一個關鍵字來跟蹤日期的變化,並通過查看Timespan從currentDate中減去previousDate來檢查ValueChanged事件以查看日期的哪一部分已經發生變化。我修改了我的答案,其中包括如何做到這一點的示例 – Erikest

+0

真的很好的解決方案,使我無法創建messagefilter或在UI中混亂不堪。非常感謝 –