asp.net
  • .net-3.5
  • repeater
  • web-controls
  • 2009-06-06 1 views 0 likes 
    0

    Это ретранслятор:Как установить контролирует значения управления повторителя безотносительно к их данным

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

    Я хочу, чтобы установить эти элементы управления на ItemTemplate в коде динамически поэтому asp.net код не должен» т выглядеть так некрасиво:

    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 
    

    в другой стороны, я не хочу, чтобы установить его или каждый обязан ItemTemplate отдельно, я хочу, чтобы установить его через родительскому управления (Повторитель) сам.

    Ответы на C# также будут приветствоваться!

    ответ

    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

    Единственный способ, которым я могу думать о том, чтобы подключить к ItemDataBound из 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; 
        //... 
    } 
    

    Если вы хотите, чтобы выбрать все TextBoxes, вы можете сделать:

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

    Если вы не хотите использовать событие ItemDataBound, вы можете поместить этот код в 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

    Есть ли способ, чтобы найти все элементы управления в повторителя? Управление [] controls = rpeater.FindAllControls(); – Shimmy

    +0

    Да, вы можете получить доступ ко всем элементам управления с помощью коллекции e.Item.Controls –

    +0

    нет, я не хочу получать доступ к e Я хочу настроить его до того, как элемент будет привязан. – Shimmy

     Смежные вопросы

    • Нет связанных вопросов^_^