2010-08-31 16 views
15

Decir que tengo un control de usuario en ASP.NET que contiene un botón:¿Es posible exponer eventos de un objeto miembro de una clase al exterior en .NET?

public class MyUserControl : UserControl { 
    private Button btnSave = new Button(); 
} 

puedo exponer cualquier propiedad del botón hacia el exterior haciendo una propiedad que señala en el botón:

public string SaveButtonText { 
    get { return btnSave.Text; } 
    set { btnSave.Text = value; } 
} 

Así que, yo puedo hacer esto para establecer el texto del botón:

MyControl.SaveButtonText = "hello world"; 

¿hay una construcción similar que pueda usar para exponer los eventos del botón en la parte exterior como wel l? Algo así como:

public event SaveButtonClick { return btnSave.OnClick; } 
... 
MyControl.SaveButtonClick += new EventHandler(...); 

Respuesta

22

Puede hacer algo así, sí: sin embargo, que hay una desventaja de este

public event EventHandler SaveButtonClick 
{ 
    add { btnSave.Click += value; } 
    remove { btnSave.Click -= value; } 
} 

Nota - el "emisor" argumento proporcionado a los controladores de eventos seguirá siendo ser el botón de guardar en lugar de su control ... eso puede no ser lo que esperaba el suscriptor. Un enfoque alternativo es suscribirse una vez para el botón de guardar controlador de clic a sí mismo:

public event EventHandler SaveButtonClick = delegate {}; 

private void OnSaveButtonClicked(object sender, EventArgs e) 
{ 
    // Replace the original sender with "this" 
    SaveButtonClick(this, e); 
} 
... 
btnSave.Click += OnSaveButtonClicked(); 

Hay una desventaja de este enfoque también ... al final tener una referencia desde el botón de guardar a "este" todo el tiempo, que puede tener un impacto en la recolección de basura. Básicamente, su control no podrá ser recolectado como basura hasta que el botón de guardar también sea elegible para la recolección de basura. En este caso, dudo mucho que sea un problema, pero vale la pena tenerlo en cuenta.

+0

Funciona muy bien! Gracias – MisterZimbu

5
public event EventHandler SaveButtonClick { 
     add { btnSave.Click += new EventHandler (value); } 
     remove { btnSave.Click-= new EventHandler (value); } 
    } 
Cuestiones relacionadas