2017-01-22 4 views
0

Je suis coincé dans une page ASP.DataBound ASP: les événements CheckBox ne se déclenchent pas comme prévu bacause de DataBinding sur Page_Load()

La page contient un ASP: conteneur contenant plusieurs CheckBox. Je dois ajouter un événement sur ces CheckBox OnCheckChange de sorte que chaque fois que l'on clique sur l'un des CheckBox, il décoche toutes les autres cases. Je pourrais utiliser un RadioButton, mais en utilisant CheckBoxes a d'autres avantages pour moi qui sont hors de ce sujet, donc je ne veux pas utiliser les boutons radio.

Ce serait théoriquement fonctionne très bien comme ça:

<ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" /> 
     <br/> 
    </ItemTemplate> 

    </ASP:Repeater> 

et dans le code sous-jacent:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 


    protected void MyCB_CheckedChanged(object sender, EventArgs e) 
    { 
     UncheckallOtherCheckBoxes(); 
    } 

Cependant, d'avoir d'autres régions de cette page pour travailler comme prévu, j'ai pour lier le DataSource sur chaque chargement de page et pas seulement la première fois. donc je dois changer Page_Load pour

protected void Page_Load(object sender, EventArgs e) 
    { 
    // if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 

Et cela provoque tout à l'échec! :) Parce que lorsque je clique sur une case à cocher, il déclenche Page_Load avant MyCB_CheckedChanged(). Si c'est DataBinds en premier et donc, la liaison de données envoie des cases à cocher des événements qui ne sont pas ceux effectués par l'utilisateur.

Y at-il un moyen de résoudre cela ????

Thx à l'avance.

+0

1. Êtes-vous sûr que vous avez besoin de relier la base de données chaque fois que la page est chargée? C'est un peu inhabituel - si vous voulez expliquer vos raisons, cela pourrait aider les autres à mieux comprendre. –

+0

@Sandy: Je pense, parce que le conteneur mentionné dans la pose est imbriqué dans un autre conteneur. Si je ne reconnais pas le conteneur maître sur PostBack, je remarque que tous les conteneurs enfants n'ont aucune donnée. –

Répondre

0

Essayez de relier votre source de données plus tard dans le cycle de vie de la page, si possible (surPreRender, par exemple). Les événements de contrôle de vos cases à cocher sont traités après PageLoad et avant PreRender et d'autres événements. Voir https://msdn.microsoft.com/en-us/library/ms178472.aspx pour plus de détails.

+0

J'aurais dû mentionner que le conteneur est imbriqué dans un autre conteneur. C'est le conteneur père qui doit être rebondi pour que les cases à cocher soient affichées sur PostBack. Donc même résultat si je déplace ma liaison dans PreRender: Si je ne reconnais pas mon père Container, sa source de données est réinitialisée, il n'y a aucun conteneur enfants, donc pas de déclencheurs de méthode MyCB_CheckedChanged. Si je ne fais que lier sur PostBack = false, lorsque vous cochez une case, la page se recharge, le conteneur père ne renvoie pas et n'a pas d'enfants. Toutes les cases à cocher disparaissent et, à nouveau, aucun événement déclencheur MyCB_CheckedChanged ... –

+0

En plus de l'événement PreRender de la page, il existe également des événements PreRender sur la plupart des conteneurs individuels. Avez-vous essayé de relier le conteneur parent sur son propre événement PreRender, ainsi que de relier séparément le conteneur enfant à son événement PreRender? De cette façon, le conteneur enfant doit regarder un parent à jour, ce que vous voulez. –

+0

En outre, ce serait bien si vous avez posté un petit exemple de code source pour illustrer le problème. Il est utile pour le reste d'entre nous de mieux comprendre ce que vous faites. :) –