Vraag OnCheckedChanged-gebeurtenishandler van asp: vink het selectievakje niet aan als het selectievakje niet is aangevinkt


Ik heb een repeater, in elk ItemTemplate van de repeater is een aspis: checkbox met een OnCheckedChanged event handlerset. De selectievakjes hebben de eigenschap AutoPostBack ingesteld op true. Wanneer een van de selectievakjes is aangevinkt, wordt de gebeurtenishandler geactiveerd. Wanneer een optie niet is aangevinkt, wordt de gebeurtenishandler niet geactiveerd.

Enig idee waarom het evenement niet vuurt, en hoe ik het vuur laat vuren? Bedankt.

Vereenvoudigde repeatercode:

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

De verzameling is als volgt aan de repeater gekoppeld:

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

De gebeurtenishandler OnItemDataBound is als volgt:

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

De gebeurtenishandler OnCheckedChanged ziet er als volgt uit:

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

Postscriptum Als iemand me ook kan vertellen waarom de afwaardering voor mij niet correct werkt ...


23
2017-09-10 10:36


oorsprong


antwoorden:


Dit komt omdat de besturingshiërarchie (en de selectievakjes in het bijzonder) niet bestaan ​​wanneer ASP.NET de .hiërarchie uitvoert Control events deel van de levenscyclus van de ASP.NET-pagina, zoals u ze later hebt gemaakt PreRender fasen. Alsjeblieft zie ASP.NET-pagina Levenscyclusoverzicht voor een gedetailleerder overzicht van de reeks gebeurtenissen.

Ik zou het zekere voor het onzekere nemen voor het advies van @ bleeeah, want daar geef je een waarde aan toe CheckBox.Checked binnen rptLinkedItems_ItemDataBound, waardoor ook de gebeurtenishandler wordt uitgevoerd:


chkLinked.Checked = IsItemLinked(item);

Verplaats in plaats daarvan:


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

In de Page.Load gebeurtenishandler.


16
2017-09-10 11:18



Probeer het te gebruikenAutoPostBack="true" soortgelijk:

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

35
2017-11-21 10:03



Probeer u opnieuw te abonneren op de CheckChanged-gebeurtenis in uw OnItemDataBound-gebeurtenis,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

5
2017-09-10 10:47



Gebruik AutoPostBack="true" soortgelijk:

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

3
2017-07-26 11:13



Abonneer u op de CheckChanged-gebeurtenis in uw Page_Init.


2
2017-09-10 10:57



U moet eventhandler voor de checklist definiëren uit het item repeater item, dan binnen het item repeater item, checklist items doorlopen en items laten nakijken.

Op de .aspx-pagina kunt u Ajax en het updatepanel gebruiken om eventhandler te activeren, maar houd er rekening mee dat u scriptmanage buiten de repeater moet definiëren.

// checklisk checkedchange eventhandler

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

en item repeater commando item: // itereer controlelijstitems en ontdek aangevinkt

    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
2017-08-15 21:14