如何捕获MonthCalendar控件的双击事件?我已经尝试过使用MouseDown的MouseEventArgs.Clicks属性,但它总是1,即使我双击。
答案 0 :(得分:4)
请注意,MonthCalendar既未在“属性”窗口中显示DoubleClick,也未显示MouseDoubleClick事件。确实有问题,本机Windows控件可以防止生成这些事件。您可以通过观察MouseDown事件并测量点击之间的时间来合成自己的事物。
在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件。为DoubleClickEx事件编写事件处理程序。
using System;
using System.Windows.Forms;
class MyCalendar : MonthCalendar {
public event EventHandler DoubleClickEx;
public MyCalender() {
lastClickTick = Environment.TickCount - SystemInformation.DoubleClickTime;
}
protected override void OnMouseDown(MouseEventArgs e) {
int tick = Environment.TickCount;
if (tick - lastClickTick <= SystemInformation.DoubleClickTime) {
EventHandler handler = DoubleClickEx;
if (handler != null) handler(this, EventArgs.Empty);
}
else {
base.OnMouseDown(e);
lastClickTick = tick;
}
}
private int lastClickTick;
}
答案 1 :(得分:2)
您需要自己跟踪点击事件。您需要使用DateSelected事件标记何时单击日期,并使用DateChanged事件来“重置”时间跨度,这样您就不会计算单击不同日期作为双击。
注意:如果您使用鼠标按下事件,则会出现错误行为
无论点击什么都会发生鼠标按下事件,例如点击日历的月/年等标题将与点击实际日期相同。因此使用DateSelected而不是鼠标按下事件。
private DateTime last_mouse_down = DateTime.Now;
private void monthCalendar_main_DateSelected(object sender, DateRangeEventArgs e)
{
if ((DateTime.Now - last_mouse_down).TotalMilliseconds <= SystemInformation.DoubleClickTime)
{
// respond to double click
}
last_mouse_down = DateTime.Now;
}
private void monthCalendar_main_DateChanged(object sender, DateRangeEventArgs e)
{
last_mouse_down = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
}
答案 2 :(得分:0)
最好添加以下代码,否则如果您在两个日期快速点击,您将获得该活动。
protected override void OnDateChanged(DateRangeEventArgs drevent) {
lastClickTick = Environment.TickCount - 2 * SystemInformation.DoubleClickTime;
base.OnDateChanged(drevent);
}