J'ai un répéteur, dans chaque 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 déclencher? 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énement 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 ...
En effet, la hiérarchie de contrôle (et les cases à cocher en particulier) n'existent pas lorsque ASP.NET exécute la partie Control events
du cycle de vie de la page ASP.NET, comme vous l'aviez créé dans les étapes PreRender
ultérieures. Veuillez consulter Vue d'ensemble du cycle de vie d'une page ASP.NET pour un aperçu plus détaillé de la séquence d'événements.
Je me tromperais par prudence pour les conseils de @ bleeeah, car vous attribuez une valeur à CheckBox.Checked
dans rptLinkedItems_ItemDataBound
, ce qui entraînerait également 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
.
Essayez d'utiliserAutoPostBack="true"
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="true"
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] + ",";
}
}
}