2013-05-17 5 views
5

у меня есть ретранслятор, который построен, как следующее:Перебор элементов ретрансляторов

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

Это связанное с использованием:

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

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

И тогда дополнительный материал делается с:

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

Однако теперь в событии onclick для страницы я пытаюсь сохранить сохраненную информацию. Это то, что я сделал до сих пор, но это всегда AYS все, кажется, пустой, и я не могу добавить .text и т.д. до конца (TextBox)item.FindControl("tbSelected");

Heres мой петли я пытаюсь по щелчку:

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

Попробуйте "Еогеасп (Control с в rptItemss.Items)" вместо RepeaterItems, затем ((TextBox) c.FindControl («tbSelected»)). Текст –

+0

Это похоже, что он может работать, как бы защитить, если (TextBox) c.FindControl («tbSelected») имеет значение null (теперь всегда отображается) – TMB87

+0

var text = (c.FindControl ("tbSelected") == null? «Пусто»: ((TextBox) c.FindControl («tbSelected»)). Текст; Поиграйте с отладчиком и посмотрите, что работает –

ответ

2

Это всегда нуль, потому что нет TextBox с идентификатором tbSelected

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

изменить его:

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

Для того, чтобы защитить ваш код от нулевого использования ключевого слова as:

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

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

Конечно, глупый я! Благодаря! – TMB87

+0

Однако, говоря, что - tbselected always = "" – TMB87

+0

Проверьте, не переустанавливаете ли ваш репитер внутри 'Page_Load' после события' PostBack', поскольку он очищает все значения, происходит очень часто :) – gzaxx

2

Попробуйте заменить

foreach (RepeaterItem item in rptItems.Items) 

с

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

Да, и, как указал gzaxx, нет следующего окна под названием tbSelected, он называется tBox в вашем примере кода, он должен иметь более описательное имя, например tbHowManyItems –

Смежные вопросы