onCheckedChanged event handler de asp: la casilla de verificación no se activa cuando la casilla de verificación está desactivada


Tengo un repetidor, en cada ItemTemplate del repetidor es una casilla de verificación asp:con un conjunto de controlador de eventos onCheckedChanged. Las casillas de verificación tienen la propiedad AutoPostBack establecida en true. Cuando se marca cualquiera de las casillas de verificación, se activa el controlador de eventos. Cuando cualquiera está desactivado, el controlador de eventos no se activa.

¿Alguna idea de por qué el evento no se dispara, y cómo lo hago? Gracias.

Código de 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 como sigue:

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);
}

P.d. Si alguien también puede decirme por qué markdown no funciona correctamente para mí...

Author: adatapost, 2009-09-10

6 answers

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 porción Control events de la ASP.NET página ciclo de vida, como los había creado en las etapas posteriores PreRender. Véase ASP.NET Page Resumen del ciclo de vida para una descripción más detallada de la secuencia de eventos.

Me equivocaría por el lado de la precaución por el consejo de @bleeah, ya que está asignando un valor a CheckBox.Checked dentro de rptLinkedItems_ItemDataBound, lo que también causaría que el controlador de eventos ejecutar:


chkLinked.Checked = IsItemLinked(item);

En su lugar, mover:


if (!Page.IsPostBack)
   {
      m_linkedItems = GetLinkedItems();
      rptLinkedItems.DataSource = GetLinkableItems();
      rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
          (rptLinkedItems_ItemDataBound);
      rptLinkedItems.DataBind();
   }

En el controlador de eventos Page.Load.

 16
Author: Rabid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-10 11:18:38

Intenta usar AutoPostBack="true" así:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
 36
Author: tommy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 07:30:53

Intente volver a suscribirse al evento CheckChanged en su evento OnItemDataBound ,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
 5
Author: bleeeah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-10 10:47:52

Usa AutoPostBack="true" así:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
 3
Author: Vikash Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 06:44:14

Suscríbase al evento CheckChanged en su Page_Init.

 2
Author: Jan Jongboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-10 10:57:14

Tiene que definir eventhandler para la lista de verificación fuera del comando repetidor item, luego dentro del comando repetidor item, vaya a través de los elementos de la lista de verificación y obtenga los elementos comprobados.

En el .puede usar Ajax y updatepanel para disparar eventhandler, pero tenga en cuenta que tiene que definir scriptmanage fuera del repetidor.

/ / checklisk checkedchange eventhandler

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
        {
        }

Y elemento elemento de comando repetidor: // iterar elementos de la lista de verificación y detectar checked

    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] + ",";
            }
        }
    }
 0
Author: Shaahin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-15 21:14:06