2013-08-28 34 views
0

我目前正在开发一个会计系统。作为一个需求,我需要设计与鼠标交互较少的系统。DatetimePicker焦点

我的问题是与datetimepicker。我通过DataGridView使用它。当用户进入一个单元格时,日期时间将显示,但它给了我一个随机焦点(日,月,年)。有时它集中在白天,有时在月份和在某一年。

Datetimepicker是否暴露了焦点?或者我怎样才能永远设置为一天? (DD/MM/YYYY)

Focus on Day

Focus on Year

回答

0

我不知道一个更好的解决方案,但这个工作。如果我找到更好的,我会在这里更新它。这个想法是recreate the handle of your DateTimePicker。下面是代码:

bool suppressEnter = false; 
//Here is the Enter event handler used for all the DateTimePicker yours 
private void dateTimePickers_Enter(object sender, EventArgs e){ 
    if (suppressEnter) return; 
    DateTimePicker picker = sender as DateTimePicker; 
    picker.Hide(); 
    typeof(DateTimePicker).GetMethod("RecreateHandle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(picker, null); 
    picker.Show(); 
    suppressEnter = true; 
    picker.Focus(); 
    suppressEnter = false; 
} 

上面的代码就是不使用win32一招。目的是为了防止在创建DateTimePicker的Handle时闪烁。我们可以使用SendMessage发送消息WM_SETREDRAW来抑制控件的绘制。通常我们有BeginUpdate()EndUpdate()但我没有在DateTimePicker上找到这些方法。此代码将更加简洁,而且根本不算黑客:

[DllImport("user32")] 
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); 
private void dateTimePickers_Enter(object sender, EventArgs e){ 
    DateTimePicker picker = sender as DateTimePicker; 
    //WM_SETREDRAW = 0xb 
    SendMessage(picker.Handle, 0xb, new IntPtr(0), IntPtr.Zero);//BeginUpdate() 
    typeof(DateTimePicker).GetMethod("RecreateHandle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(picker, null); 
    SendMessage(picker.Handle, 0xb, new IntPtr(1), IntPtr.Zero);//EndUpdate() 
}