DateTimePicker获取焦点字段

问题描述 投票:0回答:1

我想确定在一个程序中选择(高亮显示)哪个控件(日、月、年)。DateTimePicker (WinForms)应用程序。是否有一个属性,表明哪个控件被选中?如果有,我可以通过编程改变另一个控件的值吗?

有什么方法可以获得重点控件的值?DateTimePicker?

c# winforms datetimepicker
1个回答
4
投票

简答。没有,不容易。

DateTimePicker基本上是SysDateTimePick32的一个封装器,当ShowUpDown被设置为true时,它不会暴露任何易于使用的属性来确定哪个子窗口被选中。 它的源代码中甚至没有它使用的私有成员--它基本上只是将事情转发到底层的com控件上,就像UnsafeNativeMethods.SendMessage一样。

有一种方法是先发一个向上再发一个向下,然后检查哪个部分发生了变化。 这里有一个例子。 创建一个新的winforms应用程序,然后添加一个DateTimePicker、Label和Button。 之后,将下面的代码复制到form1.cs中的using语句后。

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.