2009-06-06 5 views
0

C'est le répéteur:Comment puis-je configurer le contrôle des valeurs d'un contrôle répéteur indépendamment de leurs données

<asp:Repeater ID="rptrReports" runat="server"> 
      <ItemTemplate> 
       <div style="margin: 2"> 
        <asp:Label ID="lblAccount" runat="server" Text='<%#Eval("Account").FullName%>' />&nbsp; 
        <asp:TextBox ID="txtDescription" runat="server" MaxLength="256" Text='<%#Eval("Description")%>' 
         ReadOnly="<%# Not Account.IsAdmin %>" BackColor="<%# If(Account.IsAdmin,Color.White, Color.Transparent) %>" 
         BorderStyle="<%# If(admin, BorderStyle.NotSet, BorderStyle.None) %>" 
         />&nbsp; 
        <asp:TextBox ID="txtNote" runat="server" MaxLength="1024" Text='<%#Eval("Note")%>' 
         ReadOnly="<%# Not Account.IsAdmin %>" BackColor="<%# If(Account.IsAdmin,Color.White, Color.Transparent) %>" 
         BorderStyle="<%# If(admin, BorderStyle.NotSet, BorderStyle.None) %>" />&nbsp; 
        <!-- Here I have many more controls which I want to apply same rules !--> 
       </div> 
    </ItemTemplate> 
</asp:Repeater> 

Je veux définir ces contrôles du itemtemplate dans le code dynamique de sorte que le code asp.net shouldn » t l'air si laid:

Private Sub HandleTextBoxes() 
    Dim admin = Account.IsAdmin 
    For Each tb As TextBox In _ 
         From c In rptrReports.Controls _ 
         Where TypeOf c Is TextBox 'ItemTemplate doesn't expose the properties :(
     With tb 
      .ReadOnly = Not admin 
      .BackColor = If(admin, Color.White, Color.Transparent) 
      .BorderStyle = If(admin, BorderStyle.NotSet, BorderStyle.None) 
     End With 
    Next 
End Sub 

en revanche, je ne veux pas le mettre ou chaque ItemTemplate relié séparément, je veux le mettre à travers le contrôle des parents (le répéteur) lui-même.

Les réponses en C# seront également les bienvenues!

Répondre

1

VB:

Private Shared Sub HandleTextBoxes(ByVal controls As ControlCollection) 
    Dim admin = Account.IsAdmin 

    If controls.Count > 0 Then 
     For Each Control In controls 
      HandleTextBoxes(Control.Controls) 
     Next 
    End If 

    For Each tb As TextBox In _ 
         From c In controls _ 
         Where TypeOf c Is TextBox 
     With tb 
      .ReadOnly = Not admin 
      .BackColor = If(admin, Color.White, Color.Transparent) 
      .BorderStyle = If(admin, BorderStyle.NotSet, BorderStyle.None) 
     End With 
    Next 
End Sub 

C#:

private static void HandleTextBoxes(ControlCollection controls) 
{ 
    var admin = Account.IsAdmin; 

    if (controls.Count > 0) 
     foreach (var Control in controls) 
      HandleTextBoxes(Control.Controls);   

    foreach (TextBox tb in controls) {   
     tb.ReadOnly = !admin; 
     tb.BackColor = admin ? Color.White : Color.Transparent; 
     tb.BorderStyle = admin ? BorderStyle.NotSet : BorderStyle.None; 
    } 
} 
3

La seule façon que je peux penser est de brancher à la ItemDataBound du Repeater

protected void rptrReports_ItemDataBound(object sender, RepeaterItemEventArgs e) { 
    var admin = Account.IsAdmin; 
    var txtDescription = (TextBox) e.Item.FindControl("txtDescription"); 
    var txtNote = (TextBox) e.Item.FindControl("txtNote"); 
    txtDescription.ReadOnly = admin; 
    txtDescription.BackColor = admin ? Color.White : Color.Transparent; 
    //... 
} 

Si vous voulez sélectionner tous les champs de saisie, vous pouvez le faire:

var textBoxes = e.Item.Controls.OfType<TextBox>(); 
foreach (TextBox textBox in textBoxes) { 
    // do stuff with the textBox... 
} 

Si vous ne voulez pas utiliser l'événement ItemDataBound, vous pouvez mettre ce code dans la méthode Page_PreRender:

protected void Page_PreRender(object sender, EventArgs e) { 
    for (int i = 0 ; i < rInterlocuteurs.Items.Count ; i++) { 
    var textBoxes = rInterlocuteurs.Items[i].Controls.OfType<TextBox>(); 
    foreach (TextBox textBox in textBoxes) { 
     // do stuff with the textBox... 
    } 
    } 
} 
+0

Est-il possible de trouver tous les contrôles dans le répéteur? Contrôle [] controls = rpeater.FindAllControls(); – Shimmy

+0

Oui, vous pouvez accéder à tous les contrôles en utilisant la collection e.Item.Controls –

+0

non, je ne veux pas accéder à e Je veux le configurer avant que l'élément soit lié. – Shimmy

Questions connexes