在Windows窗体应用程序中捕获doubleclick for MonthCalendar控件

时间:2011-12-14 00:04:33

标签: .net winforms double-click monthcalendar

如何捕获MonthCalendar控件的双击事件?我已经尝试过使用MouseDown的MouseEventArgs.Clicks属性,但它总是1,即使我双击。

3 个答案:

答案 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);
    }