web-dev-qa-db-de.com

OnCheckedChanged-Ereignishandler von asp: Das Kontrollkästchen wird nicht ausgelöst, wenn das Kontrollkästchen deaktiviert ist

Ich habe einen Repeater, in jedem ItemTemplate des Repeaters ist ein asp: Ankreuzfeld mit einem OnCheckedChanged-Ereignishandler festgelegt. Für die Kontrollkästchen ist die AutoPostBack-Eigenschaft auf true festgelegt. Wenn eines der Kontrollkästchen aktiviert ist, wird der Ereignishandler ausgelöst. Wenn keine Option aktiviert ist, wird der Ereignishandler nicht ausgelöst.

Irgendeine Idee, warum das Ereignis nicht ausgelöst wird und wie ich es machen kann? Vielen Dank.

Vereinfachter 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 wie folgt an den Repeater gebunden:

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-Ereignishandler sieht wie folgt aus:

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-Ereignishandler sieht wie folgt aus:

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

24
Jason

Dies liegt daran, dass die Steuerelementhierarchie (und insbesondere die Kontrollkästchen) nicht vorhanden sind, wenn ASP.NET den Control events-Teil des ASP.NET-Seitenlebenszyklus ausführt, wie Sie sie in den späteren PreRender-Stufen erstellt hatten. Siehe ASP.NET Page Life Cycle Overview für eine detailliertere Übersicht der Ereignisreihenfolge. 

Ich würde bei @ bleeeahs Rat auf der sicheren Seite bleiben, da Sie CheckBox.Checked in rptLinkedItems_ItemDataBound einen Wert zuweisen, der auch die Ausführung des Event-Handlers bewirken würde:


chkLinked.Checked = IsItemLinked(item);

Bewegen Sie stattdessen:


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

In den Page.Load-Ereignishandler.

16
Rabid

Versuchen Sie es mit AutoPostBack="true" wie folgt:

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

Abonnieren Sie das CheckedChanged-Ereignis in Ihrem ItemDataBound-Ereignis erneut.

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

Verwenden Sie AutoPostBack="true" wie folgt:

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

Abonnieren Sie das CheckChanged-Ereignis in Ihrem Page-Element.

2
Jan Jongboom

Sie müssen eventhandler für die Checkliste für den Befehl "Repeater-Element" definieren. Anschließend müssen Sie im Befehl "Repeater-Element" die Elemente der Checkliste durchgehen und die geprüften Elemente erhalten. 

Auf der ASPX-Seite können Sie Ajax und Updatepanel verwenden, um Eventhandler auszulösen. Denken Sie jedoch daran, dass Sie Scriptmanage außerhalb des Repeaters definieren müssen.

// checklisk checkedchange eventhandler

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

und Element-Repeater-Befehlselement: // Prüflistenelemente durchlaufen und geprüft prüfen

    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