2010-03-20 6 views
19

All die Möglichkeiten, die ich denken kann, um dies zu tun, scheinen sehr hackish. Was ist der richtige Weg, um dies zu tun, oder zumindest am häufigsten?Zugriff auf Textfelder in Repeater Control

Ich bin eine Reihe von Bildern aus einer LINQ-zu-SQL-Abfrage abrufen und es und einige andere Daten zu einem Repeater Databinding. Ich muss jedem Element im Repeater ein Textfeld hinzufügen, mit dem der Benutzer den Titel jedes Bildes ändern kann, ähnlich wie Flickr.

Wie greife ich auf die Textfelder im Repeater-Steuerelement zu und weiß, zu welchem ​​Bild dieses Textfeld gehört? Hier

ist, was die Wiederholungssteuerung aussehen würde, mit einem Submit-Button, der alle Bildzeilen in Linq-to-SQL aktualisieren würde:

alt text http://casonclagg.com/layout.jpg

Edit:

Dieser Code funktioniert

Nur stellen Sie sicher, dass Sie nicht Ihre Werte durch Binding outs blasen de von wenn (! Page.IsPostBack) wie ich .. Ups.

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

und senden 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 
     } 
    } 
} 
+0

Versuchen Sie auf die Textfelder auf dem Client oder auf dem Server nach einem Postback zuzugreifen? –

+0

Server in Submit_Click – Jason

Antwort

31

Haben Sie so etwas wie folgt auf den Button klicken versucht: -

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 
     } 
} 

/* Wo txtName und Img die Ids der Textbox sind und die Bildkontrollen beziehungsweise im Repeater. */

Hoffe, dass dies hilft.

+0

Sie wissen nicht den Wert von "txtName", oder? – Jason

+1

Sie erhalten den Wert mit der Eigenschaft txtName.Text im obigen Beispiel. –

+0

Ich meinte, Sie kennen den Namen des Steuerelements nicht. Also wie findest du es ... wie in FindControl ("nameOfControl"). Was ist nameOfControl? – Jason

0

Auf Postbacks können Sie die Sammlung von RepeaterItems in repeater.Items iterieren. Sie könnten dann jedes Textfeld mit Code abrufen wie

TextBox tbDemo = (TextBox)rptr.Items[index].FindControl("textBox"); 
11

.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); }   
     } 

Seien Sie sicher, EnableViewState = "False" zu Ihrem Repeater hinzuzufügen, da Sie sonst leeren String erhalten. (Das verschwendet meine Zeit, verschwenden Sie nicht Ihre eigenen :))

+2

+1 für die Erwähnung von EnableViewState –

+0

Was, wenn ich alle Textfelder abrufen und es zu einer Liste hinzufügen wollte, um die 'readonly' -Eigenschaft auf true zu deaktivieren? – Si8