2009-07-27 61 views
2

好像我在这里遇到了墙。我想要一些数据源绑定到一个asp.net转发器(好吧,不必是一个转发器,但它似乎就是我想要的)。现在,这里有一个问题:我还需要一些服务器控件,用于更新数据(文本框和按钮)。asp.net中继器中的服务器控件

就我的理解,这种确实有可能做到有条不紊吗?我不能只是将一个文本框添加到itemtemplate中,然后在后面的代码中获取它 - 看起来像它。至少不容易。有这种问题的任何已知技术?

我不能使用gridview,因为数据需要以某种方式进行格式化。

回答

6

如果你不想使用ItemCommand并希望刚刚经历Repeater的项目收集循环,让你有一个“保存”按钮在页面的底部,你可以做这样的:

foreach(RepeaterItem itm in MyRepeater.Items) 
{ 
    TextBox t = (TextBox)(itm.FindControl("TextBox1")); 
    // do something with it. 

} 

当然,你需要确保在ASPX的TextBox1中具有的Runat =“server”属性。

2

您可以使用Repeater.ItemDataBound Event来查找嵌套在Repeater中的控件。

<asp:Repeater ID="Repeater1" Runat="server" OnItemDataBound="Repeater1_ItemDataBound"> 
    <ItemTemplate> 
     <div><asp:TextBox ID="TextBox1" runat="server" /></div> 
    </ItemTemplate> 
</asp:Repeater> 

然后在后面的代码:

protected void Repeater1_ItemDataBound(object source, RepeaterCommandEventArgs e) 
{ 
    if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != 
     ListItemType.AlternatingItem) 
     return; 

    TextBox textBox1 = e.Item.FindControl("TextBox1") as TextBox; 
    if (textBox1 != null) 
    { 
    // do something with it 
    } 
} 
+0

试过了。没有工作:(看起来ItemDataBound事件发生在按钮呈现和添加之前?无论如何,textBox1对我来说是空的。顺便说一句,事件的参数类型是RepeaterItemEventArgs :) – cwap 2009-07-27 22:56:53

1

好像我的问题是我想:)

我的解决方式: 我刚添加控件我通常会做,但在ItemTemplate中。在控件的回调事件,我会去:

(例如按钮)

protected void btnUpdate_OnClick(object sender, EventArgs e) 
    { 
     Button b = sender as Button; 
     if (b != null) 
     { 
      RepeaterItem ri = b.Parent as RepeaterItem; 
      if (ri != null) 
      { 
       string name = null; 

       //Fetch data 
       TextBox txtName = ri.FindControl("txtName") as TextBox; 

。等等。

所以,找到的RepeaterItem后,我只把它当作我会与任何ControlGroup。无所谓,我实际上有5个不同的textbosses,编码ID =“txtName”,因为asp.net自动给客户端标记中的控件“混淆”名称,并在回发时将其转换回我的ID。

希望这可以帮助别人,并打扰对不起:)