2013-05-17 10 views
5

Mam repeater, który jest zbudowany tak:Przelotowe przedmiotów repeater

<asp:Repeater runat="server" ID="rptItems" OnItemDataBound="rptItems_ItemDataBound"> 
      <ItemTemplate> 
      <div class="span12 grey-box"> 
         <div class="hero-block3"> 
          <div class="row show-grid"> 
           <div class="span9"> 
            <div class="hero-content-3"> 
             <h2><asp:Literal ID="ltrName" runat="server"></asp:Literal></h2> 
             <p><asp:Literal ID="ltrDescription" runat="server"></asp:Literal></p> 
            </div> 
           </div> 
           <div class="span3"> 
           <asp:Panel ID="pnlAmount" runat="server"> 
            <div class="tour-btn" id="divAmount" runat="server"> 
             <small>How Many?<br /></small> 
             <asp:TextBox runat="server" ID="tbox" Width="40"></asp:TextBox> 
            </div> 
            </asp:Panel> 
           </div> 
          </div> 
         </div> 
        </div> 
        <div class="clear-both"></div> 
        <br /> 

      </ItemTemplate> 
     </asp:Repeater> 

to wiąże się z:

ListProducts = db.GetDataTable("select * from Products where Id in (" + selectedValues + ")"); 

     rptItems.DataSource = ListProducts; 
     rptItems.DataBind(); 

A potem ekstra rzeczy odbywa się:

protected void rptItems_ItemDataBound(object sender, 
            System.Web.UI.WebControls.RepeaterItemEventArgs e) 
    { 
     DataRowView nRow = null; 

     switch (e.Item.ItemType) 
     { 
      case ListItemType.Item: 
      case ListItemType.AlternatingItem: 
       nRow = (DataRowView)e.Item.DataItem; 
       ((Literal)e.Item.FindControl("ltrDescription")).Text = "" + nRow["Description"]; 
       ((Literal)e.Item.FindControl("ltrName")).Text = "" + nRow["Name"]; 

       if ("" + nRow["HasAmount"] == "False") 
       { 
        ((Panel)e.Item.FindControl("pnlAmount")).Visible = false; 
       } 

       break; 
     } 
    } 

Jednak teraz w zdarzeniu onclick dla strony, próbuję zapisać zapisane informacje - To co zrobiłem do tej pory, ale to wszystko Ays wszystko wydaje się być pusty, a ja nie mogę dodać .text etc do końca (TextBox)item.FindControl("tbSelected");

Heres mój pętli Staram na kliknij:

protected void doStageThree(object sender, EventArgs e) 
     { 
      foreach (RepeaterItem item in rptItems.Items) 
      { 
       if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) 
       { 
        var tbSelected = (TextBox)item.FindControl("tbSelected"); 
        var lblDescription = (Literal)item.FindControl("ltrDescription"); 
        var lblName = (Literal)item.FindControl("ltrName"); 

       } 
      } 
     } 
+0

Try "foreach (Control cw rptItemss.Items)" zamiast RepeaterItems, then ((TextBox) c.FindControl ("tbSelected")) Text –

+0

Wygląda na to, że to może działać, w jaki sposób powinienem chronić, jeśli (TextBox) c.FindControl ("tbSelected") ma wartość null (teraz jest zawsze pokazane) – TMB87

+0

var text = (c.FindControl ("tbSelected") == null? "Empty": ((TextBox) c.FindControl ("tbSelected")). Tekst; Poruszaj się z debuggerem i zobacz, co działa –

Odpowiedz

2

Zawsze jest zerowa, ponieważ nie ma TextBox id tbSelected

<asp:TextBox runat="server" ID="tbox" Width="40"></asp:TextBox> 

go zmienić na:

var tbSelected = (TextBox)item.FindControl("tbox"); 

Aby chronić swój kod od null użycia hasła as:

var tbSelected = item.FindControl("tbox") as TextBox; 

if (tbSelected != null) 
{ 
    //textbox with id tbox exists 
    tbSelected.Text = "your text"; 
} 
+0

Oczywiście, głupku mnie! Dzięki! – TMB87

+0

Jednakże, powiedzenie tego - tbselected always = "" – TMB87

+0

Sprawdź, czy nie powiążesz repeatera wewnątrz 'Page_Load' po zdarzeniu' PostBack', ponieważ spowoduje to wyczyszczenie wszystkich wartości, dzieje się bardzo często :) – gzaxx

2

Spróbuj wymienić

foreach (RepeaterItem item in rptItems.Items) 

z

foreach (Control c in rptItems.Items) 
    { 
     if(c.FindControl("tbSelected") != null) 
     { 
      var selectedText = ((TextBox)c.FindControl("tbSelected")).Text; 
     } 
    } 
+0

Tak, a jak wskazał gzaxx, nie ma następnego pola o nazwie tbSelected, nazywa się ono tBox w twoim przykładowym kodzie, powinno mieć bardziej opisową nazwę, taką jak tbHowManyItems –