0
我目前正在开发一个会计系统。作为一个需求,我需要设计与鼠标交互较少的系统。DatetimePicker焦点
我的问题是与datetimepicker。我通过DataGridView使用它。当用户进入一个单元格时,日期时间将显示,但它给了我一个随机焦点(日,月,年)。有时它集中在白天,有时在月份和在某一年。
Datetimepicker是否暴露了焦点?或者我怎样才能永远设置为一天? (DD/MM/YYYY)
我目前正在开发一个会计系统。作为一个需求,我需要设计与鼠标交互较少的系统。DatetimePicker焦点
我的问题是与datetimepicker。我通过DataGridView使用它。当用户进入一个单元格时,日期时间将显示,但它给了我一个随机焦点(日,月,年)。有时它集中在白天,有时在月份和在某一年。
Datetimepicker是否暴露了焦点?或者我怎样才能永远设置为一天? (DD/MM/YYYY)
我不知道一个更好的解决方案,但这个工作。如果我找到更好的,我会在这里更新它。这个想法是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()
}