2010-06-18 3 views
0

J'ai la mise en œuvre suivante:Comment conserver une trace d'un enregistrement dans un répéteur imbriqué?

alt text http://i47.tinypic.com/2v16fde.png

Comme vous pouvez le voir, j'ai un répéteur (la liste des machines) et un répéteur imbriqué (liste des WindowsServices l'intérieur de chaque machine). Pour chaque service Windows, je peux effectuer une action en utilisant un bouton. Cependant, pour effectuer cette action, j'ai besoin de savoir quelle Machine et quel WindowsService sont concernés.

Ceci est mon code:

protected void Page_Init(object sender, EventArgs e) 
     { 
      rptMachine.ItemDataBound += new RepeaterItemEventHandler(rptMachine_ItemDataBound);   

     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 

      // bind the Machine repeater 
      rptMachine.DataSource = _monitoringService.Machines; 
      rptMachine.DataBind(); 
     } 

     protected void rptMachine_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       Repeater nestedRepeater = (Repeater) e.Item.FindControl("rptWindowsService"); 

       nestedRepeater.DataSource = ((IMachine) e.Item.DataItem).WindowsServices; 
       nestedRepeater.DataBind(); 

       Button btnActionInner = null; 

       // bind the action button situated inside the nested repeater 
       foreach(RepeaterItem ri in nestedRepeater.Items) 
       { 
        if((Button)ri.FindControl("btnAction") != null) 
        { 
         btnActionInner = (Button) ri.FindControl("btnAction"); 
         btnActionInner.CommandName = "ActionState"; 

         btnActionInner.CommandArgument = strWindowsService; 

        } 
       } 
      } 
     } 

     protected void rptWindowsService_ItemCommand(object source, RepeaterCommandEventArgs e) 
     { 

      // do the specific action stop/run for the windows service 
      if (e.CommandName == "ActionState") 
      { 
       if(((Button)(e.CommandSource)).Text.Equals("Stop")) 
       { 

       } 

       else if(((Button)(e.CommandSource)).Text.Equals("Run")) 
       { 

       } 
      } 
     } 

    } 
} 

Donc, fondamentalement, j'ai besoin de savoir (à l'intérieur rptWindowsService_ItemCommand) quelle est la paire qui est concernée par l'opération.

Quelle est la meilleure façon de faire cela?

N'hésitez pas à demander plus de précisions!

Merci

Répondre

1

Sur DataboundItem définir une propriété temporaire dans votre code-behind au « courant » machine/service fenêtre, puis juste se lier à eux.

<asp:Repeater DataSource="<%# MachineList %>" OnItemDataBound="Machine_DataBound"> 
    <asp:Repeater DataSource="<%# ((Machine)Container.DataItem).Services %>"> 
     <asp:Button id="whatever" Text='<%# string.Format("Kill Service ({0}.{1})", CurrentMachine.Name, ((Service)Container.DataItem).Name); %>' /> 
    </asp:Repeater> 
</asp:Repeater> 

code Derrière:

private Machine CurrentMachine { get; set; } 

public void Machine_DataBound(object sender, RepeaterItemEventArgs e) 
{ 
    CurrentMachine = e.Item as Machine; 
} 
Questions connexes