2010-11-07 4 views
0

J'utilise des répéteurs imbriqués. Je rends plusieurs groupes et chaque groupe a des membres dont j'ai besoin pour rendre différentes propriétés.Page cycle question asp.net

J'utilise ItemDataBound sur le répéteur imbriqué pour trouver le membre que le répéteur imbriqué rend en ce moment. J'ai <%%> tags dans le .aspx qui vérifie si l'utilisateur actuel a une certaine propriété, et si elle a, je rends les divs et autres éléments HTML qui doivent y aller.

Toutes les données sont correctes. Lorsque je débogue, je recueille les données correctes et j'obtiens les bonnes informations sur l'utilisateur et les propriétés de l'utilisateur. J'enregistre l'utilisateur évalué courant dans une chaîne protégée currentRenderedUser que j'utilise pour savoir qui est l'utilisateur dans le fichier aspx. Le problème est que lorsque le <%%> sur l'aspx est évalué, le répéteur a déjà parcouru tous les ensembles ou quelque chose, parce que currentRenderedUser est le même pendant chaque évaluation dans le fichier aspx.

Je ne connais pas la bonne terminologie pour le code "<%%>" dans le fichier aspx, désolé.

Ce sont les parties pertinentes du ASPX (je pense):

<ItemTemplate> 
    <!-- nested repeater data --> 

    <tr> 
     <td width="50%"><div class="memberName"><%# DataBinder.Eval(Container.DataItem, "userEmail")%></div></td> 


     <div style="display: none;"></div> 
     <% if (CheckIfUserIsAdmin(email, currentRenderedGroup)) 
        { %> 

        <%if (CheckIfUserIsAdmin(currentRenderedUser, currentRenderedGroup)) 
        { //Checks so that the user being rendered isn't already admin%> 
          <td><div style="margin-right:30px;" class="makeAdminButton"></div></td> 
        <% } 
        else 
        {%> 
         <td><div style="margin-right:30px;" class="makeAdminButton"><asp:ImageButton ID="ImageButtonMakeUserAdmin" CommandName="MakeAdmin" BorderWidth="0" ImageUrl="~/gfx/doAdmin.png" CommandArgument='<%#Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail")) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Make admin" /></div></td> 
         <td><div class="removeUserButton"><asp:ImageButton ID="ImageButtonRemoveUserFromGroup" CommandName="RemoveUserFromGroup" BorderWidth="0" ImageUrl="~/gfx/can.png" CommandArgument='<%# Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail")) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Delete" /></div></td> 
           <% } %> 
     <%}%> 

    </tr> 


</ItemTemplate> 

Et c'est la partie de l'arrière-plan qui évalue l'utilisateur actuel:

protected void NesterRepeater_ItemDataBound(object sender, 
         System.Web.UI.WebControls.RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem 
     || e.Item.ItemType == ListItemType.Item) 
     { 
      DataRowView dataRowView = (DataRowView)e.Item.DataItem; 

      string memberInGroup = Convert.ToString(dataRowView["userEmail"]); 
      currentRenderedUser = memberInGroup; 
     } 
} 

Comment puis-je résoudre cela d'une manière meilleure (ou au moins, de travail)? Merci

Répondre

1

Le problème est que l'événement ItemDataBound est exécuté en premier, donc vous obtenez probablement toujours la valeur du dernier enregistrement du DataSource du répéteur si je ne me trompe pas.

Il est préférable de le faire de cette façon:

<ItemTemplate> 
    <tr> 
     <td width="50%"><div class="memberName"><%# DataBinder.Eval(Container.DataItem, "userEmail")%></div></td> 
     <div style="display: none;"></div> 
     <asp:PlaceHolder ID="phNoAdmin" runat="server" Visible="false"> 
      <td><div style="margin-right:30px;" class="makeAdminButton"></div></td> 
     </asp:PlaceHolder> 

     <asp:PlaceHolder ID="phAdmin" runat="server" Visible="false"> 
      <td><div style="margin-right:30px;" class="makeAdminButton"><asp:ImageButton ID="ImageButtonMakeUserAdmin" CommandName="MakeAdmin" BorderWidth="0" ImageUrl="~/gfx/doAdmin.png" CommandArgument='<%#Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail")) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Make admin" /></div></td> 
      <td><div class="removeUserButton"><asp:ImageButton ID="ImageButtonRemoveUserFromGroup" CommandName="RemoveUserFromGroup" BorderWidth="0" ImageUrl="~/gfx/can.png" CommandArgument='<%# Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail")) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Delete" /></div></td> 
     </asp:PlaceHolder> 
    </tr> 
</ItemTemplate> 

Et le code derrière:

protected void NesterRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     DataRowView dataRowView = (DataRowView)e.Item.DataItem; 

     PlaceHolder phNoAdmin = e.Item.FindControl("phNoAdmin") as PlaceHolder; 
     PlaceHolder phAdmin = e.Item.FindControl("phAdmin") as PlaceHolder; 

     string memberInGroup = Convert.ToString(dataRowView["userEmail"]); 
     currentRenderedUser = memberInGroup; 

     if (CheckIfUserIsAdmin(email, currentRenderedGroup)) 
     { 
      if (CheckIfUserIsAdmin(currentRenderedUser, currentRenderedGroup)) 
      { 
       phNoAdmin.Visible = true; 
       phAdmin.Visible = false; 
      } 
      else 
      { 
       phNoAdmin.Visible = false; 
       phAdmin.Visible = true; 
      } 
     }    
    } 
} 

Il serait préférable si vous liez les données à l'intérieur du 2 contrôle PlaceHolder J'ai aussi écrit dans le code derrière pour raison de maintenabilité.

HTH

+0

Merci beaucoup! J'y suis depuis plusieurs heures maintenant. Parfait! Cette solution exacte a bien fonctionné. – Phil

Questions connexes