我在转发器中放置了一个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";
答案 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">