0

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

我的问题是日期时间选择器。我在 DataGridView 上使用它。当用户输入一个单元格时,将显示日期时间,但它给了我一个随机焦点(日、月、年)。有时它关注天,有时关注月,有时关注年。

Datetimepicker 是否暴露了它的焦点?或我如何始终设置为 Day?( dd /MM/yyyy)

专注于一天

专注于年份

4

1 回答 1

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. 这段代码会更简洁,而且一点也不hacky:

[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()
}
于 2013-08-28T03:49:51.397 回答