DateTimePicker得到焦点后,焦点落在年份上。要求按回车后,实现年->月->日->下一个控件 的依次焦点转换。请问keypress事件该怎么写?先谢了!

解决方案 »

  1.   

    您需要首先从DateTimePicker继承得到一个类MyDateTimePicker,然后再Override MyDateTimePicker的ProcessCmdKey方法,在Form上使用MyDateTimePicker。以下提供简单的示例代码:
     class MyDateTimePicker : System.Windows.Forms.DateTimePicker 
        {
            protected override bool IsInputKey(System.Windows.Forms.Keys keyData)
            {            return base.IsInputKey(keyData);
            }        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (keyData == Keys.Enter)
                {
                    
                    SendKeys.Send("{RIGHT}");
                    return true;
                }
                else
                {
                    return base.ProcessCmdKey(ref msg, keyData);
                }
            }
        }
      

  2.   

    谢谢wsw0515(wsw) !如果不用DateTimePicker继承的方法,通过判断当前选中的是年、月、日,来决定SendKeys.Send("{RIGHT}")或SendKeys.Send("{Tab}");是否可行呢?
    换句话说,如何判断当前焦点在DateTimePicker的年、月、日的那一个区域上?
      

  3.   

    Mark,等下回来看,谢谢先(-_-....)
      

  4.   

    private void dateTimePicker1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                    SendKeys.Send("{RIGHT}");
            }这样可以,已经测试了
      

  5.   

    楼上:还有日->下一个控件的焦点切换问题,需要先判断当前焦点在DateTimePicker的年、月、日的那一个区域上。怎样判断?
      

  6.   

    在窗口或DateTimePicker的父控件中添加如下的基类方法的重写:protected override bool ProcessKeyPreview(ref Message m)
    {
    if (this.ActiveControl is DateTimePicker && m.Msg == 0x100 && (int)m.WParam == 13)
    {
    m.WParam = (IntPtr)0x27;
    }
    return base.ProcessKeyPreview(ref m);
    }
      

  7.   

    to hbxtlhx(平民百姓-自已动手,丰衣足食):
    谢谢!再请教:
    DateTimePicker 是放在panel1里面的,我该在哪里添加这段代码?
    (int)m.WParam == 13是回车吧?m.Msg == 0x100 和m.WParam = (IntPtr)0x27;又指什么?
      

  8.   

    你要放到Panel里,但是你要重写这个Panel把代码放到Panel的代码里,其实你也可以放到Form里,这样你不必继承一个Panel,因为你的“Form1”就是从Form继承下来的,所以把代码放到“Form1”就可以了。因为判断的是ActiveControl,只要ActiveControl能够是DateTimePicker就可以操作了。
      

  9.   

    如果你只写到Form上,那么代码这样改一下:protected override bool ProcessKeyPreview(ref Message m)
    {
    Control ctr = Control.FromHandle(m.HWnd); if (ctr is DateTimePicker && m.Msg == 0x100 && (int)m.WParam == 0xd)
    {
    m.WParam = (IntPtr)0x27;
    }
    return base.ProcessKeyPreview(ref m);
    }
      

  10.   

    谢谢hbxtlhx(平民百姓-自已动手,丰衣足食)!
    试过了,可以在年->月->日之间循环移动。
    但如何在焦点移到 日 上时,再按回车移到下一个控件(即:如何判断焦点已经移到 日 上),有办法吗?