asp.net - El evento DropDownList OnSelectedIndexChanged deja de funcionar cuando se agrega el Control de usuario aparentemente no relacionado
user-controls repeater (1)
Tengo una página con un repetidor. Dentro de cada elemento de ese repetidor hay paneles de actualización, cada uno con un control:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text=''<%# Eval("Property1") %>'' />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostback="true"
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Text="1" Value="1" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="3" Value="3" />
<asp:ListItem Text="4" Value="4" />
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
El código detrás de los suministros de la fuente de datos:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
List<Class1> Source = new List<Class1>();
Source.Add(new Class1("Test1"));
Source.Add(new Class1("Test2"));
Source.Add(new Class1("Test3"));
Repeater1.DataSource = Source;
Repeater1.DataBind();
}
}
Y aquí está la clase vinculada:
public class Class1
{
public string Property1 { get; set; }
public string Property2 { get { return "Property 2"; } }
public Class1() { Property1 = string.Empty; }
public Class1(string P1) { Property1 = P1; }
}
Y cuando se cambia el índice seleccionado de la lista desplegable, este es el evento que se activa en el código subyacente:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
RepeaterItem ri = (RepeaterItem)ddl.NamingContainer;
Label l = (Label)ri.FindControl("Label1");
l.Text = ddl.SelectedValue;
UpdatePanel up = (UpdatePanel)ri.FindControl("UpdatePanel1");
up.Update();
}
Todo este código funciona bien. Cuando se cambia el índice seleccionado, el texto de la etiqueta se actualiza para que coincida, y todo está feliz.
El problema es cuando agrego un control de usuario al repetidor. No parece importar lo que haga el usuario, pero aquí hay un ejemplo simple que usé para romper este código de muestra:
Frente:
<asp:Label ID="Label1" runat="server" />
Espalda:
public partial class WebUserControl1 : System.Web.UI.UserControl
{
private Class1 _Item = null;
public Class1 Item { get { return _Item; } set { _Item = value; } }
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Item.Property1;
}
}
Cuando registro este control de usuario en la página:
<%@ Register Src="WebUserControl1.ascx" TagName="Control1" TagPrefix="uc1" %>
Y colóquelo dentro del repetidor en su propio panel de actualización:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text=''<%# Eval("Property1") %>'' />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<uc1:Control1 ID="Control1" runat="server" Item=''<%# ((IDataItemContainer)Container).DataItem %>'' />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostback="true"
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Text="1" Value="1" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="3" Value="3" />
<asp:ListItem Text="4" Value="4" />
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
El control de usuario se pinta correctamente (lo que sugiere que está funcionando), pero el evento OnSelectedIndexChanged deja de disparar. Incluso la inserción de System.Diagnostics.Debugger.Break () dentro del evento no se activa. Todo lo demás (el código del evento, la carga de la página, la clase) permanecen igual. La única diferencia es agregar este control de usuario a la página y al repetidor.
¿Alguien puede decirme por qué la introducción de este control de usuario (aparentemente no relacionado) parece romper el comportamiento de DropDownList?
¡Gracias por cualquier ayuda!
EDITAR: respondido. Me faltaba una prueba de Page.IsPostBack en el evento Page_Load de WebUserControl1. Error tonto.
Sí, tuve un problema similar, si no revisas la propiedad ! IsPostback en la carga de la página, entonces el control vuelve a rebotar y, por lo tanto, los otros controles internos como la lista desplegable también se recuperan y reinician y, por lo tanto, el evento no se activa