如何访问转发器内的控件?

时间:2013-02-17 07:41:38

标签: c# asp.net

我在转发器中放置了一个TextBox,但我不知道访问这些TextBox的ID是什么。那么我应该如何访问它们呢?

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

4 个答案:

答案 0 :(得分: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);
            }
        }

答案 1 :(得分: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>";
         }
      }
   }   

答案 2 :(得分:0)

最短的方式,imho,是迭代转发器的所有项目,找到所需的控件,并用它做任何你想做的事情。 例如,在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 ()

答案 3 :(得分:0)

您可以使用 Repeater.ItemDataBound

<asp:Repeater id="Repeater1" OnItemDataBound="R1_ItemDataBound" runat="server">