OnCheckedChanged Ereignishandler von asp: Checkbox wird nicht ausgelöst, wenn Checkbox deaktiviert ist

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe einen Repeater in jedem ItemTemplate des Repeaters ist ein asp: Checkbox mit einem OnCheckedChanged Event-Handler-Set. Die Kontrollkästchen haben die Autopostback-Eigenschaft auf true gesetzt. Wenn eine der Kontrollkästchen aktiviert ist, feuert die Event-Handler. Wenn jeder nicht aktiviert ist, wird der Ereignishandler nicht ausgelöst.

Jede Idee, warum das Ereignis nicht ausgelöst, und wie ich mgiht es macht Feuer? Danke.

Vereinfachte Repeater Code:

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

Die Sammlung ist an den Repeater gebunden wie folgt:

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

Der OnItemDataBound Event-Handler ist wie folgt:

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

Der OnCheckedChanged Event-Handler ist wie folgt:

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. Wenn jemand kann mir auch sagen, warum Abschlag für mich nicht richtig funktioniert ...

War es hilfreich?

Lösung

Das ist, weil die Steuerhierarchie (und die Kontrollkästchen im Besonderen) nicht existieren, wenn ASP.NET den Control events Teil des ASP.NET Seite Lebenszyklus ausführt, wie Sie sie in den späteren Stadien PreRender geschaffen hatten. Bitte finden Sie unter ASP.NET Seite Lebenszyklus Übersicht für detaillierte Übersicht über die Ereignissequenz.

würde ich auf der Seite der Vorsicht für die Beratung des @ bleeeah irren, für Sie einen Wert zuweisen sind innerhalb CheckBox.Checked rptLinkedItems_ItemDataBound, die auch die Event-Handler auszuführen verursachen würde:


chkLinked.Checked = IsItemLinked(item);

Stattdessen bewegen:


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

In dem Page.Load Ereignishandler.

Andere Tipps

Versuchen usingAutoPostBack="true" wie folgt aus:

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

Versuchen Wieder Abonnement des CheckedChanged Ereignis in Ihrem ItemDataBound Ereignisse,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Verwenden AutoPostBack="true" wie folgt aus:

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

Melden Sie sich an dem CheckChanged Ereignis in Ihrem Page_Init.

Sie haben Eventhandler aus Repeater Artikel Befehl für Checkliste zu definieren, dann innerhalb des Repeaters Artikel Befehl, Checkliste Artikel durchlaufen und geprüft Einzelteile zu erhalten.

In der ASPX-Seite können Sie Ajax und Update verwenden Eventhandler zu feuern, aber im Kopf behalten müssen Sie scriptmanage außerhalb des Repeaters definieren.

// checklisk checkedchange Eventhandler

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

und Artikel Repeater Befehl Artikel: // Iterierte Checkliste Artikel und detect geprüft

    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] + ",";
            }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top