El controlador de eventos OnCheckedChanged de asp: casilla de verificación no se activa cuando la casilla de verificación no está marcada

StackOverflow https://stackoverflow.com/questions/1404528

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un repetidor, en cada Item La plantilla del repetidor es 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 true. 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);
}

P.S. Si alguien también puede decirme por qué el descuento no funciona correctamente para mí ...

¿Fue útil?

Solución

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 Eventos de control del ciclo de vida de la página ASP.NET, como había creado. en las etapas posteriores de PreRender . Consulte 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 en el lado de la precaución por el consejo de @bleeeah, porque estás asignando un valor a CheckBox.Checked dentro de rptLinkedItems_ItemDataBound , que también hacer 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 .

Otros consejos

Intente usar AutoPostBack = " true " de esta manera:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>

Intente volver a suscribirse al evento CheckedChanged en su evento ItemDataBound,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Utilice AutoPostBack = " true " de esta manera:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />

Suscríbase al evento CheckChanged en su Page_Init.

Debe definir el manejador 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 administrador de eventos, pero tenga en cuenta que debe definir la gestión de script fuera del repetidor.

// checklisk checkedchange eventhandler

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

y elemento de comando de repetidor de elementos: // iterar los elementos de la lista de verificación y detectarlos marcados

    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] + ",";
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top