2011-05-19 13 views
7

Quiero duplicar un control como un Botón, Cuadro de texto, etc. Pero no sé cómo puedo copiar los métodos del controlador de eventos (como Click) al nuevo control.Cómo clonar controladores de eventos de control en tiempo de ejecución?

tengo el siguiente código ahora:

var btn2 = new Button(); 
btn2.Text = btn1.Text; 
btn2.size = btn1.size; 
// ... 
btn2.Click ??? btn1.Click 

¿Hay alguna otra manera de duplicar un control?

+0

no estoy seguro de por qué querría duplicar, pero un simple pasado de copia crearía una nueva instancia del control. –

+0

¿Desea crear un duplicado del botón digamos en tiempo de ejecución? con el mismo controlador de eventos que los botones anteriores? –

+0

@Haris Hasan: Sí, lo hago. – mrbm

Respuesta

12

para clonar todos los eventos de cualquier control WinForms:

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance); 
var eventHandlerList = eventsField.GetValue(button1); 
eventsField.SetValue(button2, eventHandlerList); 
+0

Hrm, tal vez. ¿Pero esto está documentado en alguna parte? ¿Se garantiza que los "eventos" serán el nombre de ese campo para toda la eternidad? Además, tiene un aspecto similar a la solución [aquí] (http://www.codeproject.com/KB/cs/DelegateFromEvent.aspx). –

+0

Muchas gracias !!! – mrbm

+0

@Cody - funciona en .NET 2, 3.5 y 4. Funcionará más tarde - nadie lo sabe. ¿Es un truco? Sí lo es. –

0

No entendí tu pregunta correctamente. Puede adjuntar un evento a múltiples controles como este.

Button1.Click += button_click; 
Button2.Click += button_click; 
+0

Sí, ahora, supongo que no conozco la función "button_click", solo tengo Button1 y quiero obtener las funciones vinculadas al evento Click. – mrbm

+0

Entonces creo que debes llamar al método Button.PerformClick(). Ejecutará el evento click asociado. – Anuraj

+0

Sí, es bueno, pero no puedo usarlo directamente, btn2.Haga clic en + = nuevo EventHandler (btn1.PerformClick); Error >> Sin sobrecarga para 'PerformClick' coincide con delegar 'System.EventHandler' – mrbm

5

Sólo necesita el método add the event handler para el nuevo control de botón. C# usa el operador += para hacer esto. Por lo que podría escribe simplemente:

btn2.Click += btn1_Click 

Como alternativa, un enfoque algo más potente es use reflection. De particular uso aquí sería el EventInfo.AddEventHandler method.

+3

Pero quiero duplicar el control y no sé la función "btn1_Click" – mrbm

+0

@mrbm: Como mencioné en el comentario a la respuesta de Vimvq1987, si no lo hace Si conoce el nombre del método del controlador de eventos en tiempo de ejecución, necesitará usar el reflejo. Es un poco más complicado, pero mucho más poderoso. Los enlaces que he proporcionado tienen un código de muestra completo. –

-5

el mejor enfoque utiliza una clase de componente y heredar el control de dicha Clase

public class DuplicateButton : OrginalButton 
{ 

} 

puede realizar cambios en la clase parcial, de modo que no hay necesidad de crear eventos

+0

No lo creo. El evento se adjunta a una instancia del botón, no a la clase en sí. La herencia simplemente no funciona, en este caso – Vimvq1987

+0

¡Quiero duplicar un control, no una clase! – mrbm

+1

¿Qué tiene esto que ver con la pregunta? –

Cuestiones relacionadas