2016-07-14 151 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中混乱不堪。非常感谢 –