Unterscheiden zwischen Klicks und Doppelklicks
Frank Dzaebel, erstellt am: 1.11.2008, zuletzt geändert: 1.11.2008
Kategorie:Controls, .NET-Version:3.5, [Download]

Bei Controls, wie CheckBox und Button sind Ereignisse wie DoubleClick zurecht nicht für die Intellisense sichtbar und nicht direkt vorgesehen. Um es dennoch zu ermöglichen hat das reine Aktivieren des "ControlStyles.StandardDoubleClick" oft den Nachteil, dass das Click-Ereigniss dann doppelt (oder gar dreifach) ausgegeben wird. Verschiedene Verfahren bieten sich an. Hier ein Pattern, dass u.a. über die "SystemInformation.DoubleClickTime" implementiert ist.

Weiterführende Literatur: 
  
Gewusst wie: Unterscheiden zwischen Klicks und Doppelklicks 

   Control.DoubleClick-Ereignis

  /// <summary>CheckBox, die zusätzlich ein DoubleClick-Ereignis bereitstellt.</summary>
  class CheckBoxDC : CheckBox
  {
    [Browsable(true)]
    public new event EventHandler DoubleClick;

    protected override void OnMouseDown(MouseEventArgs mevent)
    {
      if (mevent.Clicks > 1) { doubleClicked = true; DoubleClick(this, mevent); }
      else base.OnMouseDown(mevent);
    }

    volatile bool doubleClicked;

    protected override void OnClick(EventArgs e)
    {
      new Thread(new ThreadStart(DoubleClickWarten)).Start();
    }

    void DoubleClickWarten()
    {
      doubleClicked = false; int start = Environment.TickCount;
      while (Environment.TickCount - start < SystemInformation.DoubleClickTime)
        Thread.Sleep(10);
      if (!doubleClicked) Invoke(new ThreadStart(BaseOnClick));
    }

    void BaseOnClick() { base.OnClick(EventArgs.Empty); }
  }

Folgende einfache Methode ist verführerisch und funktioniert auch, nur tritt einzig bei einem DoubleClick auch ein Click auf, dessen Vermeidung der Zweck der oben angeführten Implementation ist.
class CheckBoxDC : CheckBox
{
  [Browsable(true)]
  public new event EventHandler DoubleClick;

  protected override void OnMouseDown(MouseEventArgs mevent)
  {
    if (mevent.Clicks > 1) DoubleClick(this, mevent);
    else base.OnMouseDown(mevent); 
  }
}