lado - crear controles dinamicamente asp.net c#
Asignar un evento a un control personalizado dentro de un control Repeater (3)
Hay dos cosas que puede intentar ver si esto ayuda:
- Intente enlazar su MyRepeater en cada solicitud de página, no solo cuando! IsPostBack.
- Vincula MyRepeater dentro de OnInit.
Para 1) Si los controles creados dinámicamente se crean la primera vez que se carga la página y luego otra vez cuando se produce la devolución de datos, ASP.NET notará que el evento generado coincide y activará el evento.
Para 2) El diseñador utilizado siempre coloca el archivo adjunto del evento en OnInit, aunque también debería funcionar bien en OnLoad.
Tengo un control Repeater que en algunas de sus celdas contiene un UserControl que contiene una DropDownList. En el evento ItemDataBound del control Repeater, estoy asignando un evento a DropDownList de la siguiente manera:
protected void MyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
...
MyControl myControl = (MyControl)e.Item.FindControl("MyControl01");
myControl.DataSource = myObject;
myControl.DataBind();
myControl.DropDownList.SelectedItemChange += MyMethod_SelectedIndexChanged;
myControl.DropDownList.AutoPostBack = true;
....
}
protected void MyMethod_SelectedIndexChanged(object sender, EventArgs e)
{
//Do something.
}
El evento nunca se dispara. Por favor necesito ayuda.
Su evento no se genera en un PostBack porque su controlador de eventos no se ha adjuntado (solo se adjunta durante la iteración del ciclo de vida de la página cuando su repetidor está enlazado a datos).
Si adjunta su controlador de eventos de forma declarativa en el marcado, como:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
</ItemTemplate>
</asp:Repeater>
Luego se llamará a su controlador de eventos durante PostBacks.
Primero asegúrese de que su enlace de datos no esté reiniciando sus menús desplegables.
Aquí está el código para el control que anidará dentro del repetidor ItemTemplate
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ListBoxContainer.ascx.cs" Inherits="OAAF.Common.ListBoxContainer" %>
<asp:ListBox ID="lstFromControl" runat="server" Rows="1" DataTextField="Text" DataValueField="Id" OnSelectedIndexChanged="LstFromControl_SelectedIndexChanged" AutoPostBack="true" />
El código detrás del control que se anidará dentro del repetidor ItemTemplate
public partial class ListBoxContainer : System.Web.UI.UserControl
{
//declare the event using EventHandler<T>
public event EventHandler<EventArgs> ListBox_SelectedIndexChanged;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void LstFromControl_SelectedIndexChanged(object sender, EventArgs e)
{
//fire event: the check for null sees if the delegate is subscribed to
if (ListBox_SelectedIndexChanged != null)
{
ListBox_SelectedIndexChanged(sender, e);
}
}
}
Tenga en cuenta que este control anterior utiliza el evento de cambio de cuadro de lista internamente, luego activa un evento propio: ListBox_SelectedIndexChanged. Puede crear argumentos de eventos personalizados aquí también, pero esto usa los EventArgs estándar.
Su repetidor que tiene el control puede verse así
<asp:Repeater ID="rptTest" runat="server">
<ItemTemplate>
<br />
<ctrl:wucListBox ID="listBoxControl" runat="server" OnListBox_SelectedIndexChanged="ListBoxControl_SelectedIndexChanged" />
</ItemTemplate>
</asp:Repeater>
Registre el control en la parte superior de la página donde está el repetidor, por ejemplo
<%@ Register Src="~/Common/ListBoxContainer.ascx" TagName="wucListBox" TagPrefix="ctrl" %>
Maneja el evento ListBox_SelectedIndexChanged, y el método que maneja esto está en el código detrás de la página donde se encuentra el repetidor.
protected void ListBoxControl_SelectedIndexChanged(object sender, EventArgs e)
{
//some code
}