【问题标题】:DateTimePicker get focused fieldDateTimePicker 获取焦点字段
【发布时间】:2016-11-17 23:30:29
【问题描述】:

我正在尝试确定在 DateTimePicker (WinForms) 应用程序中选择(突出显示)哪个控件(天、月、年)。是否有一个属性指示选择了哪个控件?如果是这样,我可以通过编程方式仅从另一个控件更改该控件的值吗?

有没有办法获得DateTimePicker 的集中控制?

【问题讨论】:

  • 你的最终目标是什么?你能通过更新 Value 属性来完成你想要的吗?我似乎记得有一种方法可以确定复合控件中哪个控件具有焦点,但我在画一个空白,因为我已经有好几年没有接触过 WinForms 中的任何东西了。
  • 目标是更改 DateTime 单个值(与我在 DateTimePicker 中选择一列并在键盘上键入新值相同)。但是,我不想使用系统键盘。我希望有一些属性指的是 DateTimePicker 的集中子控件,但没有像 @Erikest 所描述的那样
  • 在复合控件中确定哪个控件具有焦点的方法,你的意思是IMessageFilter吗?

标签: c# winforms datetimepicker


【解决方案1】:

简短回答:不,不容易。

DateTimePicker 基本上是 SysDateTimePick32 的包装器,并且不会公开任何易于使用的属性来确定当 ShowUpDown 设置为 true 时选择哪个子窗口。它甚至在它使用的源代码中没有私有成员——它基本上只是将事情转发到底层的 com 控件,ala UnsafeNativeMethods.SendMessage

一种方法是先发送一个向上然后向下发送并检查哪个部分发生了变化。这是一个示例。创建一个新的 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();
        }
    }
}

【讨论】:

  • 我担心它是这样制作的。谢谢你的回答。
  • 您可以做的一件事是跟踪日期的变化,方法是先发送一个键,然后发送一个键,然后检查 ValueChanged 事件,通过查看 Timespan 从减去从 currentDate 的 previousDate。我已经修改了我的答案以包含如何执行此操作的示例
  • 非常好的解决方案,让我免于创建消息过滤器或在 UI 中弄得一团糟。非常感谢
  • 在 UserControl 中为我工作。 code
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多