Press "Enter" to skip to content

Usare un metodo statico per aggiungere un EventHandler a molti controlli

Molto spesso può succedere di avere dei comportamenti comuni a più Forms, che se gestiti manualmente genererebbero codice ripetitivo e quindi problemi in caso di successivi cambiamenti e manutenzione delle form, in questi casi, è possibile usare un metodo statico per assegnare ai controlli interessati un eventhandler che aggiunga la funzionalità richiesta.

Per fare un esempio, ho generato un progetto Windows Forms, in cui ho inserito tre form, chiamati rispettivamente FrmMain, FrmType1, FrmType2, ed una classe statica EventHelper.

FrmMain è una form MDI con una MenuStrip in cui ho inserito due opzioni, per richiamare le due form secondarie, in ognuna di esse ho inserito vari tipi di controlli.

Lo scopo della mia funzione, è fare in modo che il tasto Enter funzioni come il tabulatore, facendo passare il focus da un controllo all’altro. In questo caso è una funzione applicabile a tutti i tipi di controllo.

private void openAType1FormToolStripMenuItem_Click(object sender, EventArgs e)
{
	FrmType1 frm = new FrmType1();
	frm.MdiParent = this;
	frm.Show();
}
 
private void openAType2FormToolStripMenuItem_Click(object sender, EventArgs e)
{
	FrmType2 frm = new FrmType2();
	frm.MdiParent = this;
	frm.Show();
}

Gli Event handler dei due menu strip che generano i due tipi di child form nella MDI.

private void FrmType1_Load(object sender, EventArgs e)
{
	EventHelper.SetEnterLikeTabAllControls(this);
}
private void FrmType2_Load(object sender, EventArgs e)
{
	EventHelper.SetEnterLikeTabAllControls(this);
}

Gli event handler per l’evento Load delle due child form, dove viene utilizzato l’helper che aggancia l’evento che trasforma il tasto Enter in un Tab su tutti i controlli contenuti nella form.

La classe EventHelper.cs

In questa classe helper, creiamo i metodi necessari a permetterci di assegnare ai controlli contenuti in una form un evento che controlla la pressione del tasto Enter e la trasforma in un tasto Tab in modo tale che i controlli si comportino in modo simile agli antichi controlli VBA o ai NON controlli delle applicazioni console.

private static void KeyDownEnterControl(object sender, KeyEventArgs e)
{
	try
	{
 
		TextBox txt = sender as TextBox;
 
		if (txt == null || txt.Multiline == false)
		{
			if (e.KeyCode == Keys.Enter && !e.Shift && !e.Control && !e.Alt)
			{
				e.Handled = true;
				SendKeys.Send("\t");
			}
		}
 
 
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

Ecco l’event handler generico, che sostituisce il tasto Enter con un tasto Tab a su tutte le TextBox salvo le Textbox multiline.

public static KeyEventHandler KeyDownEnter()
{
		return new System.Windows.Forms.KeyEventHandler(KeyDownEnterControl);
}

Il metodo che genera un event handler da assegnare alle textbox.

public static void SetEnterLikeTabAllControls(Control pControl)
{
	try
	{
		foreach (Control ctr in pControl.Controls)
		{
			if (ctr.Controls.Count > 0)
			{
				SetEnterLikeTabAllControls(ctr);
			}
			else
			{
				Control uba = ctr as Control;
 
				if (uba != null)
				{
					uba.KeyDown += KeyDownEnter();
				}
			}
		}
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

Ed infine, la funzione ricorsiva che cicla su tutti i controlli che non sono contenitori, assegnando all’event handler KeyDown la nostra funzione.

Il progetto di test ricostruito per mostrare queste funzionalità è disponibile al link qui sotto per il download: