Search code examples
asp.net.net-3.5repeaterweb-controls

How do I set controls' values of a repeater control regardless to their data


This is the repeater:

<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>

I want to set these controls of the itemtemplate in code dynamically so the asp.net code shouldn't look so ugly:

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

In the other hand, I don't want to set it or each bound ItemTemplate separately, I want to set it thru to parent control (the repeater) itself.

Answers in C# will be welcomed too!


Solution

  • 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;
        }
    }