首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DatetimePicker聚焦

DatetimePicker聚焦
EN

Stack Overflow用户
提问于 2013-08-28 03:05:59
回答 1查看 2.3K关注 0票数 0

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

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

数据选择器是否暴露了它的焦点?或者我怎样才能一直设定为一天呢?(dd/MM/yyyy)

EN

回答 1

Stack Overflow用户

发布于 2013-08-28 03:49:51

我不知道更好的解决办法,但这有效。如果我找到更好的,我会在这里更新。这个想法是recreate the handle of your DateTimePicker。以下是代码:

代码语言:javascript
复制
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句柄时防止闪烁。我们可以使用SendMessage发送消息WM_SETREDRAW来抑制控件的绘制。通常我们有BeginUpdate()EndUpdate(),但我在DateTimePicker上找不到这些方法。这段代码将更简洁,一点也不讨厌:

代码语言:javascript
复制
[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()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18478736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档