ASP.NET: agregue el controlador de eventos a LinkButton dentro de Repeater en una llamada de RenderContent

Tengo un WebPart de Sharepoint que carga un control de usuario personalizado. El control de usuario contiene un Repetidor que a su vez contiene varios LinkButtons.

En la llamada RenderContent en la parte web, tengo un código para agregar controladores de eventos:

ArrayList nextPages = new ArrayList(); //populate nextPages .... AfterPageRepeater.DataSource = nextPages; AfterPageRepeater.DataBind(); foreach (Control oRepeaterControl in AfterPageRepeater.Controls) { if (oRepeaterControl is RepeaterItem) { if (oRepeaterControl.HasControls()) { foreach (Control oControl in oRepeaterControl.Controls) { if (oControl is LinkButton) { ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click); } } } } } 

Sin embargo, la función PageNavigateButton_Click nunca se llama. Sin embargo, puedo ver que se agrega como un controlador de eventos en el depurador.

¿Algunas ideas? Estoy perplejo de cómo hacer esto.

Cuando se llama a RenderContent (), todos los controladores de eventos registrados han sido llamados por el marco. Debe agregar los controladores de eventos en un método anterior, como OnLoad ():

 protected override void OnLoad(EventArge e) { base.OnLoad(e); EnsureChildControls(); var linkButtons = from c in AfterPageRepeater.Controls .OfType() where c.HasControls() select c into ris from lb in ris.OfType() select lb; foreach(var linkButton in linkButtons) { linkButton.Click += PageNavigateButton_Click } } 

¿Ha intentado asignar las propiedades CommandName y CommandArgument a cada botón a medida que realiza la iteración? El control Repeater admite el evento ItemCommand, que es un evento que se activará cuando se golpee un control con la propiedad CommandName.

Desde allí es bastante fácil de procesar porque los valores de CommandName y CommandArgument se pasan al evento y son fácilmente accesibles.

Debe asegurarse de que el botón de enlace se vuelva a agregar al árbol de control y / o que el evento se vuelva a cablear al control antes de que se dispare el evento.

Artículo @ 4guysfromrolla

Nunca he hecho una SharePoint WebPart, así que no sé si esto se aplicará. Pero si se tratara de una página apsx simple, diría que para cuando se esté procesando, ya es demasiado tarde. Intente agregar los controladores de eventos en los eventos Init o PreInit del control.


Edit: espera, creo que Dilli-O podría tener razón. Consulte la sección Agregar controles de botón a un repetidor al final de http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html . Está en VB.NET, pero puede hacer fácilmente lo mismo en C #.

Como han señalado otros, está agregando el controlador de eventos demasiado tarde en el ciclo de vida de la página. Para SharePoint WebParts, normalmente desearía anular los métodos de clase ‘OnInit / CreateChildControls para manejar la actividad.

Si necesita que su componente web implemente la interfaz del marcador INamingContainer , el marco lo utiliza para permitir que las devoluciones de datos vuelvan al control correcto … Además, todos los controles de su componente web deben tener una identificación.