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

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

  •  05-07-2019
  •  | 
  •  

Question

J'ai un répéteur, dans chaque élément 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? 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énements 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 ...

Était-ce utile?

La solution

En effet, la hiérarchie des contrôles (et les cases à cocher en particulier) n'existent pas lorsque ASP.NET exécute la partie Evénements de contrôle du cycle de vie de la page ASP.NET, telle que vous l'aviez créée. dans les dernières étapes PreRender . Veuillez consulter Présentation du cycle de vie d'une page ASP.NET pour obtenir un aperçu plus détaillé de la séquence d'événements.

Je voudrais faire preuve de prudence pour le conseil de @ bleeeah, car vous attribuez une valeur à CheckBox.Checked dans rptLinkedItems_ItemDataBound , ce qui aurait également pour effet provoquer 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 .

Autres conseils

Essayez d’utiliser AutoPostBack = "vrai" comme ceci:

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

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

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Utilisez AutoPostBack = "vrai" comme ceci:

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

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

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] + ",";
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top