web-dev-qa-db-fra.com

Gestionnaire d'événements OnCheckedChanged d'asp: la case à cocher ne se déclenche pas lorsque la case à cocher est décochée

J'ai un répéteur, dans chaque ItemTemplate du répéteur est un asp: case à cocher avec un gestionnaire d'événement OnCheckedChanged. La propriété AutoPostBack est définie sur true dans les cases à cocher. Lorsque l'une des cases à cocher est cochée, le gestionnaire d'événements est déclenché. Lorsque l'une des options est décochée, le gestionnaire d'événements ne se déclenche pas.

Avez-vous une idée de la raison pour laquelle l'événement ne se déclenche pas et comment puis-je le faire déclencher? Merci.

Code répéteur simplifié:

<asp:Repeater ID="rptLinkedItems" runat="server">            
    <ItemTemplate>      
    <asp:CheckBox ID="chkLinked" runat="server" 
     Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
    </ItemTemplate>    
</asp:Repeater>

La collection est liée au répéteur comme suit:

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

Le gestionnaire d'événement OnItemDataBound est le suivant:

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

Le gestionnaire d'événement OnCheckedChanged est le suivant:

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 quelqu'un peut aussi me dire pourquoi le démarquage ne fonctionne pas correctement pour moi ...

24
Jason

En effet, la hiérarchie de contrôle (et les cases à cocher en particulier) n'existent pas lorsque ASP.NET exécute la partie Control events du cycle de vie de la page ASP.NET, comme vous l'aviez créé dans les étapes PreRender ultérieures. Veuillez consulter Vue d'ensemble du cycle de vie d'une page ASP.NET pour un aperçu plus détaillé de la séquence d'événements. 

Je me tromperais par prudence pour les conseils de @ bleeeah, car vous attribuez une valeur à CheckBox.Checked dans rptLinkedItems_ItemDataBound, ce qui entraînerait également l'exécution du gestionnaire d'événements:


chkLinked.Checked = IsItemLinked(item);

Au lieu de cela, déplacez:


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

Dans le gestionnaire d'événements Page.Load.

16
Rabid

Essayez d'utiliserAutoPostBack="true" comme ceci:

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

Essayez de vous réabonner à l'événement CheckedChanged dans votre événement ItemDataBound,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
5
bleeeah

Utilisez AutoPostBack="true" comme ceci:

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

Abonnez-vous à l'événement CheckChanged dans votre Page_Init.

2
Jan Jongboom

Vous devez définir eventhandler pour la liste de contrôle à partir de la commande d'élément répéteur, puis à l'intérieur de la commande d'élément répéteur, parcourir les éléments de la liste de contrôle et obtenir les éléments vérifiés. 

Dans la page .aspx, vous pouvez utiliser Ajax et updatepanel pour déclencher le gestionnaire d'événements, mais gardez à l'esprit que vous devez définir la gestion des scripts en dehors du répéteur.

// checklisk checkchange eventhandler

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

et item item de commande de répéteur: // itérer les éléments de la liste de contrôle et détecter les éléments cochés

    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
Shaahin