2011-12-13 40 views
0

我在爲一家咖啡館製作菜單。它顯示食物和溜冰場的物品,價格,然後我想要一個文本框,人們可以在文本框中顯示他們想購買的每個商品的數量。然後,我希望每個文本框都具有基於菜單項ID的唯一ID。無法在中繼器內找到我的文本框

這是我轉發:

<asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ParentRepeater_ItemDataBound"> 
     <ItemTemplate> 
      <h2> 
       <%#DataBinder.Eval(Container.DataItem, "typenavn") %></h2> 
      <asp:HiddenField ID="HiddenField1" Value='<%# Eval("id") %>' runat="server" /> 
      <asp:Repeater ID="ChildRepeater" runat="server"> 
       <ItemTemplate> 
        <table> 
         <tr> 
          <td style="width: 400px"> 
           <%#DataBinder.Eval(Container.DataItem, "productName") %> 
          </td> 
          <td style="width: 400px"> 
           <%#DataBinder.Eval(Container.DataItem, "pris") %> 
          </td> 
          <td> 
           <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
          </td> 
         </tr> 
        </table> 
       </ItemTemplate> 
      </asp:Repeater> 
     </ItemTemplate> 
    </asp:Repeater> 

這是我的代碼背後:

protected void ParentRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     RepeaterItem item = e.Item; 

     if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) 
     { 
      Repeater ChildRepeater = (Repeater)item.FindControl("ChildRepeater"); 

      HiddenField hide = e.Item.FindControl("HiddenField1") as HiddenField; 
      int id = Convert.ToInt32(hide.Value); 

      var query = from es in gr.products 
         where es.typeID == id 
         select es; 

      List<product> list = new List<product>(); 
      foreach (product pro in query) 
      { 
       list.Add(pro); 
      } 

      ChildRepeater.DataSource = list; 
      ChildRepeater.DataBind(); 

      int h = 0; 

      foreach (RepeaterItem item1 in ChildRepeater.Items) 
      { 
       if (item1.ItemType == ListItemType.Item || item1.ItemType == ListItemType.AlternatingItem) 
       { 
        TextBox txt = (TextBox)item1.FindControl("TextBox1") as TextBox; 
        HiddenField hf = (HiddenField)item1.FindControl("HiddenField2") as HiddenField; 

        for (int i = 0; i < list.Count; i++) 
        { 
         txt.ID = "HB" + list[h].id.ToString(); 
         hf.Value = list[h].id.ToString(); 
         h++; 
         break; 
        } 
       } 
      } 
     } 
    } 

任何人有關於如何找到文本框的任何想法?

+0

http://stackoverflow.com/questions/2484806/accessing-textboxes-in-repeater-control 使用這個鏈接希望能幫助到你。 – Neha

回答

1

您必須搜索RepeaterItem中的文本框。讓你無論是處理內部Repeater的ItemDataBound事件,或者你只是遍歷所有RepeaterItems:

foreach(RepeaterItem item in ChildRepeater.Items){ 
    if(item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem){ 
    var txt = (TextBox)item.FindControl("TextBox1"); 
    } 
} 
+0

什麼是TablePanier? – Oedum

+0

我試過了:ContentPlaceHolder MainContent = Page.Master.FindControl(「MainContent」)作爲ContentPlaceHolder; Repeater Parent = MainContent.FindControl(「ParentRepeater」)as Repeater; Repeater Child = Parent.FindControl(「ChildRepeater」)as Repeater;但它只給了我父母的中繼器,但不是chilrepeater – Oedum

+0

是的,正如我已經說過的。 Textbox的NamingContainer是子節點的RepeaterItem。所以無法通過外部Repeater使用FindControl而不使用遞歸函數。順便說一句,你應該看到我的編輯版本,不包含'TablePanier',並告訴你如何找到'Textbox1' –