2013-02-17 4 views
0

Я разместил TextBox внутри репитера, но я не знаю, какой будет идентификатор для доступа к этим текстовым полям. Итак, как я должен получить к ним доступ?Как получить доступ к элементам управления внутри репитера?

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1"> 
     <ItemTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged" AutoPostBack="true" ></asp:TextBox> 
     </ItemTemplate> 
    </asp:Repeater> 

Нет FindControl, пожалуйста!

Я хочу что-то похожее на следующий код для доступа.

TextBox1.Text = "Hi"; 
+0

Как вы выбираете строку? –

+0

Я ничего не выбираю. В кодировке я использую идентификатор элементов управления, чтобы проверить, что введено. –

+0

Это похоже на дубликат: http://stackoverflow.com/questions/2484806/accessing-textboxes-in-repeater-control – Igoy

ответ

1

Я хотел бы предложить вам сделать это как так ...

// another way to search for asp elements on page 


public static void GetAllControls<T>(this Control control, IList<T> list) where T : Control 
     { 
      foreach (Control c in control.Controls) 
      { 
       if (c != null && c is T) 
        list.Add(c as T); 
       if (c.HasControls()) 
        GetAllControls<T>(c, list); 
      } 
     } 
+0

Мое приложение жестко закодировано, и я не знаю об идентификаторах. Вот почему я не хочу использовать FindControl. Как я уже говорил, ваш ответ не соответствует этому вопросу. Однако спасибо за ваше предложение –

+0

Итак, вы думаете, что ваш ответ в порядке? Это практически то же самое – IamStalker

+0

, если вы удалите свое первое решение, я могу принять ваш обновленный ответ. –

0

обычным способом, без большого количества рекурсии с FindControl (который не является очень эффективным) является проволоки до OnItemDataBound даже на ретрансляторе, а в коде позади доступа к отдельным элементам строки данных. Вы в значительной степени должны использовать FindControl, но в этом случае вам не нужно переписывать коллекцию элементов управления.

void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

     // This event is raised for the header, the footer, separators, and items. 

     // Execute the following logic for Items and Alternating Items. 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 

     if (((Evaluation)e.Item.DataItem).Rating == "Good") { 
      ((Label)e.Item.FindControl("RatingLabel")).Text= "<b>***Good***</b>"; 
     } 
     } 
    } 
0

Самый короткий путь, имхо, это перебрать все пункты повторителя, найти нужный контроль и сделать все, что вы хотите с ним. Пример, в VB.NET

For Each item As RepeaterItem In Repeater1.Items 
    Dim temporaryVariable As TextBox = DirectCast(item.FindControl("TextBox1"), TextBox) 
    temporaryVariable.Text = "Hi!" 
Next 

Но помните, что у вас есть к этому после Repeater1. DataBind()

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