All the ways I can think to do this seem very hackish. What is the right way to do this, or at least most common?
I am retrieving a set of images from a LINQ-to-SQL query and databinding it and some other data to a repeater. I need to add a textbox to each item in the repeater that will let the user change the title of each image, very similar to Flickr.
How do I access the textboxes in the repeater control and know which image that textbox belongs to?
Here is what the repeater control would look like, with a submit button which would update all the image rows in Linq-to-SQL:
alt text http://casonclagg.com/layout.jpg
Edit:
This code works
Just make sure you don't blow your values away by Binding outside of if(!Page.IsPostBack) like me.. Oops.
<asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <div class="itemBox"> <div class="imgclass"> <a title='<%# Eval("Name") %>' href='<%# Eval("Path") %>' rel="gallery"> <img alt='<%# Eval("Name") %>' src='<%# Eval("Path") %>' width="260" /> </a> </div> <asp:TextBox ID="TextBox1" Width="230px" runat="server"></asp:TextBox> </div> </ItemTemplate> </asp:Repeater>
And Submit Click:
protected void Button1_Click(object sender, EventArgs e) { foreach (RepeaterItem item in Repeater1.Items) { TextBox txtName = (TextBox)item.FindControl("TextBox1"); if (txtName != null) { string val = txtName.Text; //do something with val } } }
The Repeater control is used to display a repeated list of items that are bound to the control. The Repeater control may be bound to a database table, an XML file, or another list of items. Repeater is a Data Bind Control. Data Bind Controls are container controls.
Have you tried something like following on the button click:-
foreach (RepeaterItem item in Repeater1.Items) { TextBox txtName= (TextBox)item.FindControl("txtName"); if(txtName!=null) { //do something with txtName.Text } Image img= (Image)item.FindControl("Img"); if(img!=null) { //do something with img } }
/* Where txtName and Img are the Ids of the textbox and the image controls respectively in the repeater.*/
Hope this helps.
.aspx
<asp:Repeater ID="rpt" runat="server" EnableViewState="False"> <ItemTemplate> <asp:TextBox ID="txtQty" runat="server" /> </ItemTemplate> </asp:Repeater>
.cs
foreach (RepeaterItem rptItem in rpt.Items) { TextBox txtQty = (TextBox)rptItem.FindControl("txtQty"); if (txtQty != null) { Response.Write(txtQty.Text); } }
Be sure to add EnableViewState="False" to your repeater, otherwise you will get empty string. (That wasted my time, dont waste yours :) )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With