OnCheckedChanged gestore di eventi di asp:checkbox non viene generato quando la casella di controllo è deselezionata

Ho un ripetitore, in ogni ItemTemplate del ripetitore è un asp:checkbox con un OnCheckedChanged gestore di eventi insieme. Le caselle di controllo hanno la proprietà AutoPostBack impostata su true. Quando una qualsiasi delle caselle di controllo è selezionata, il gestore di eventi incendi. Quando è deselezionata, il gestore di eventi non fuoco.

Un’idea del perché l’evento non viene generato, e come ho mgiht rendono fuoco? Grazie.

Semplificato ripetitore codice:

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

La collezione è legato al ripetitore come segue:

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

Il OnItemDataBound gestore di eventi è il seguente:

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

Il OnCheckedChanged gestore di eventi è il seguente:

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. Se qualcuno può anche dirmi perché markdown non funziona correttamente per me…

  • RE: il P. S. non mi stavi facendo è giusto. 😉 Prova ad aprire questa domanda in modalità di modifica e vedere quali modifiche che ho fatto. Punto chiave 4 spazi per codice di prefisso, che l’editore si incarica di fare nel pannello di destra.
  • Grazie Antonio, e mi dispiace che ho perso nell’editor.
InformationsquelleAutor Jason | 2009-09-10



6 Replies
  1. 16

    Questo perché la gerarchia di controllo (e le caselle di controllo in particolare) non esistono quando ASP.NET esegue il Control events porzione di ASP.NET ciclo di vita della pagina, come li aveva creati in seguito PreRender fasi. Si prega di vedere ASP.NET Ciclo di Vita della Pagina Panoramica per una panoramica più dettagliata della sequenza di eventi.

    Vorrei sbagliare sul lato della cautela per @bleeeah i consigli, per l’assegnazione di un valore a CheckBox.Checked all’interno rptLinkedItems_ItemDataBound, che potrebbe anche causare il gestore eventi per l’esecuzione:

    
    chkLinked.Checked = IsItemLinked(item);

    Invece, spostare:

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

    In Page.Load gestore di eventi.

    • Grazie, Rabbioso. Hanno fatto che, oltre a ri-sottoscrizione dell’evento come mentoined in precedenza e ora funziona tutto esattamente come previsto.
    • Nessun problema, si potrebbe si prega di votare la mia domanda stackoverflow.com/questions/1368403? Sono disperato per qualche consiglio 🙂
  2. 37

    Provare a utilizzareAutoPostBack="true" come questo:

    <asp:CheckBox ID="chkLinked" runat="server" Checked="false"
        OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
    • Grazie! Nel mio caso si tratta solo di lavoro.
    • Bella soluzione, grazie per questo! +1
    • Molto bello , grazie 😉
    • Ho avuto una parte di questo corretto, AutoPostBack completato i miei obiettivi!
    • Soluzione perfetta, perché AutoPostBack aggiornare la pagina dopo pagina, di cambiare lo stato della casella di controllo e quindi si può lavorare sulla proprietà checkbox_checkchanged correttamente.
  3. 5

    Prova a re-iscrizione al CheckChanged evento nel vostro evento OnItemDataBound ,

    chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
    • Che sembra aver risolto il problema, grazie. Non mi è chiaro perché, però, qualcuno può illuminarmi?
    • Funziona perché i gestori di eventi di controlli dinamici devono essere cablati ogni volta che la pagina viene ricostruito.
    • A meno che non lo si faccia in Init, in che modo il quadro si prende cura di questo.
  4. 3

    Utilizzare AutoPostBack="true" come questo:

    <asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
        Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
    • Grazie, questo mi ha aiutato 🙂
  5. 0

    È necessario definire eventhandler per un elenco di controllo di ripetitore elemento di comando, quindi all’interno del ripetitore elemento di comando, passare attraverso la lista e ottenere gli elementi selezionati.

    Nel .pagina aspx è possibile utilizzare Ajax e updatepanel a fuoco eventhandler, ma tieni a mente che è necessario definire scriptmanage al di fuori del ripetitore.

    //checklisk checkedchange eventhandler

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

    e voce ripetitore comando:
    //scorrere una lista di e di rilevare controllato

        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] + ",";
                }
            }
        }

Lascia un commento