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

Это повторитель:

<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# тоже приветствуются!


person Shimmy Weitzhandler    schedule 06.06.2009    source источник


Ответы (1)


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

Если вы хотите выбрать все текстовые поля, вы можете сделать:

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...
    }
  }
}
person Julien Poulin    schedule 06.06.2009
comment
Есть ли способ найти все элементы управления в репитере? Элементы управления Control[] = rpeater.FindAllControls(); - person Shimmy Weitzhandler; 07.06.2009
comment
Да, вы можете получить доступ ко всем элементам управления, используя коллекцию e.Item.Controls. - person Julien Poulin; 07.06.2009
comment
нет, я не хочу получать доступ к e, я хочу настроить его еще до того, как элемент будет привязан. - person Shimmy Weitzhandler; 07.06.2009
comment
Вы не можете получить доступ к элементам управления внутри ItemTemplate повторителя, потому что, в конце концов, Repeater - это просто коллекция RepeaterItem, и влияние на ItemTemplte не окажет никакого влияния на саму коллекцию... - person Julien Poulin; 07.06.2009