Ciao
Il fatto è che l'evento Click viene generato quando fai click col mouse, quindi viene generato anche prima dell'evento DoubleClick (infatti il computer non può prevedere se al primo click ne seguirà un altro)
Comunque il modo per risolvere c'è, basta ritardare l'effettivo svolgimento di ciò che vorresti fare quando fai un click singolo dopo il tempo massimo per eseguire un doppio click... Io l'ho fatto usando un timer, ecco un esempio del codice:
//Questo è il costruttore
public MainForm()
{
InitializeComponent();
//Crea il timer
clickDelayer = new System.Timers.Timer(SystemInformation.DoubleClickTime);
clickDelayer.AutoReset = false;
clickDelayer.Elapsed += new ElapsedEventHandler(clickDelayedHandler);
}
bool dblClicked;
System.Timers.Timer clickDelayer;
private void TuoControl_Click(object sender, EventArgs e)
{
//Quando viene eseguito un click, attende che passi il tempo
//stabilito prima di eseguire il codice, così da poter evitare
//il codice del click se viene eseguito il doppio click
dblClicked = false;
clickDelayer.Start();
}
private void TuoControl_DoubleClick(object sender, EventArgs e)
{
//Se double clicki, avvisa il click di non essere eseguito
dblClicked = true;
//Gestisce il doppio click
ManageDoubleClick();
}
void clickDelayedHandler(object sender, ElapsedEventArgs e)
{
//Controlla se è stato fatto il double click, in tal caso non fa il click
if (dblClicked)
return;
//Gestisce il click, sul thread del Form
if (this.InvokeRequired)
this.Invoke(new Action(ManageClick));
else
this.ManageClick();
}
void ManageClick()
{
//Fai quello che devi fare
MessageBox.Show("Clicked!");
}
void ManageDoubleClick()
{
//Fai quello che devi fare
MessageBox.Show("DoubleClicked!");
}
Luca