Exponer todos los controladores de eventos de UserControl

Tengo un montón de TextBoxes en mi WinForm UserControl. Cada uno de esos cuadros de texto tiene pocos controladores de eventos, como On_Enter – muestra ListBox con sugerencias, On_KeyUP – if Keys.Code == Keys.Enter – SelectNextControl (). Cuando coloco ese control en un formulario, ninguno de esos eventos se activa. ¿Cómo exponer todos esos eventos a la forma contenida? ¿Cómo hacer que los eventos de UserControl activen los controladores de eventos de ese UserControl?

Entonces, si entiendo bien, creo que hay dos formas de proceder:

Enfoque 1

En el UserControl, establezca la propiedad Modifiers de cada cuadro de texto (o los que le interesen) en público:

introduzca la descripción de la imagen aquí

Luego, en el formulario que utiliza este UserControl, puede acceder a todos estos cuadros de texto y, por lo tanto, a sus eventos:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); myUserControl1.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown); } } 

Enfoque 2 (Tomado de este post )

Puede crear nuevos eventos para su UserControl que simplemente transfieran el evento de un cuadro de texto subyacente. Los cuadros de texto subyacentes pueden permanecer privados para el UserControl.

En el UserControl agregar este evento:

 public event KeyEventHandler TextBox1KeyDown { add { textBox1.KeyDown += value; } remove { textBox1.KeyDown -= value; } } 

O puede crear un solo evento que se ocupe de todos los cuadros de texto:

 public event KeyEventHandler AnyTextBoxKeyDown { add { textBox1.KeyDown += value; textBox2.KeyDown += value; textBox3.KeyDown += value; ... } remove { textBox1.KeyDown -= value; textBox2.KeyDown -= value; textBox3.KeyDown -= value; ... } } 

Ahora su UserControl tiene un evento propio que el código en el formulario puede usar:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); myUserControl1.TextBox1KeyDown += new KeyEventHandler(myUserControl1_TextBox1KeyDown); myUserControl1.AnyTextBoxKeyDown += new KeyEventHandler(myUserControl1_AnyTextBoxKeyDown ); } private void myUserControl1_TextBox1KeyDown(object sender, KeyEventArgs e) { /* We already know that TextBox1 was pressed but if * we want access to it then we can use the sender * object: */ TextBox textBox1 = (TextBox)sender; /* Add code here for handling when a key is pressed * in TextBox1 (inside the user control). */ } private void myUserControl1_AnyTextBoxKeyDown(object sender, KeyEventArgs e) { /* This event handler may be triggered by different * textboxes. To get the actual textbox that caused * this event use the following: */ TextBox textBox = (TextBox)sender; /* Add code here for handling when a key is pressed * in the user control. */ } } 

Tenga en cuenta que si bien este enfoque mantiene privados los cuadros de texto dentro del UserControl, el argumento del sender aún puede acceder a ellos desde el controlador de eventos.