c# - El controlador de eventos OnCheckedChanged de asp: casilla de verificación no se activa cuando la casilla de verificación no está marcada
asp.net c#-2.0 (6)
Debe definir el controlador de eventos para el comando de lista de verificación fuera del elemento repetidor, luego, dentro del comando de elemento repetidor, revisar los elementos de la lista de verificación y obtener los elementos marcados.
En la página .aspx puede usar Ajax y updatepanel para activar el manejador de eventos, pero tenga en cuenta que debe definir la gestión de script fuera del repetidor.
// checklisk checkchange eventhandler
protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
}
y item repetidor comando item: // iterar los elementos de la lista de verificación y detectarlos verificados
protected void Repeater1_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
CheckBoxList cbl = (CheckBoxList)e.Item.FindControl("CheckBoxList1");
cbl.SelectedIndexChanged += new EventHandler(chkLinked_CheckedChanged);
string name = "";
for (int i = 0; i < cbl.Items.Count; i++)
{
if (cbl.Items[i].Selected)
{
name += cbl.Items[i].Text.Split('','')[0] + ",";
}
}
}
Tengo un repetidor, en cada ItemTemplate del repetidor hay una casilla de verificación asp: con un conjunto de controladores de eventos OnCheckedChanged. Las casillas de verificación tienen la propiedad AutoPostBack establecida en verdadero. Cuando cualquiera de las casillas está marcada, el controlador de eventos se dispara. Cuando no se selecciona ninguno, el controlador de eventos no se activa.
¿Alguna idea de por qué el evento no se activa y cómo lo hago? Gracias.
Código repetidor simplificado:
<asp:Repeater ID="rptLinkedItems" runat="server">
<ItemTemplate>
<asp:CheckBox ID="chkLinked" runat="server"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
</ItemTemplate>
</asp:Repeater>
La colección está vinculada al repetidor de la siguiente manera:
protected override void OnPreRenderComplete(EventArgs e)
{
if (!Page.IsPostBack)
{
m_linkedItems = GetLinkedItems();
rptLinkedItems.DataSource = GetLinkableItems();
rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
(rptLinkedItems_ItemDataBound);
rptLinkedItems.DataBind();
}
base.OnPreRenderComplete(e);
}
El controlador de eventos OnItemDataBound es el siguiente:
private void rptLinkedItems_ItemDataBound(Object sender, RepeaterItemEventArgs args)
{
if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
{
CategoryItem item = args.Item.DataItem as CategoryItem;
Literal litItemName = args.Item.FindControl("litItemName") as Literal;
CheckBox chkLinked = args.Item.FindControl("chkLinked") as CheckBox;
litItemName.Text = item.Text;
chkLinked.Checked = IsItemLinked(item);
chkLinked.AutoPostBack = true;
chkLinked.InputAttributes.Add("Value", item.Id.ToString());
}
}
El controlador de eventos OnCheckedChanged es el siguiente:
protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
CheckBox linkedItem = sender as CheckBox;
Boolean itemState = linkedItem.Checked;
Int32 itemId = Int32.Parse(linkedItem.InputAttributes["Value"].ToString());
DataAccessLayer.UpdateLinkedItem(m_linkingItem, Utilities.GetCategoryItemFromId(itemId), itemState);
}
PD: si alguien también puede decirme por qué el descuento no funciona correctamente para mí ...
Esto se debe a que la jerarquía de control (y las casillas de verificación en particular) no existen cuando ASP.NET ejecuta la parte de Control events
del ciclo de vida de la página ASP.NET, como los creó en las etapas posteriores de PreRender
. Consulte la Descripción general del ciclo de vida de la página ASP.NET para obtener una descripción más detallada de la secuencia de eventos.
Me equivocaría por precaución en el consejo de @bleeeah, ya que le está asignando un valor a CheckBox.Checked
rptLinkedItems_ItemDataBound
dentro de rptLinkedItems_ItemDataBound
, lo que también haría que el controlador de eventos se ejecute:
chkLinked.Checked = IsItemLinked(item);
En su lugar, mueva:
if (!Page.IsPostBack)
{
m_linkedItems = GetLinkedItems();
rptLinkedItems.DataSource = GetLinkableItems();
rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
(rptLinkedItems_ItemDataBound);
rptLinkedItems.DataBind();
}
En el controlador de eventos Page.Load
.
Intente usar AutoPostBack="true"
esta manera:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
Intente volver a suscribirse al evento CheckChanged en su evento OnItemDataBound,
chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
Suscríbete al evento CheckChanged en tu Page_Init.
Use AutoPostBack="true"
esta manera:
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />