2010-04-04 52 views
1

我想要做的是通過迭代轉發器和讀取一些控件的值:ASP .NET - 如何通過中繼器迭代?

foreach (RepeaterItem iter in TablePanier.Items) 
    { 
     string guid = ((HiddenField)iter.FindControl("guid")).Value.ToString(); 

     // nombre exemplaires du livre 

     int nbExemplaires = int.Parse(((System.Web.UI.WebControls.TextBox)iter.FindControl("txtNbExemplaires")).Text.ToString()); 

    } 

正如你所看到的,我有一個HiddenValue和一個TextBox。不幸的是,這是行不通的,值不正確。

怎麼了?

謝謝!

編輯: 這裏是形式的全部代碼:

public partial class Panier : System.Web.UI.Page 
{ 
    Bussiness.Manager _manager = new Bussiness.Manager("MSSQLSERVER"); 
    IEnumerable<Bussiness.iPanier> _paniers; 
    CurrencyConvertor _currencyConvertor = new CurrencyConvertor(); 
    Bussiness.iCommande _commande; 
    int idPanier; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["login"] != null) 
     { 
      Security security = new Security(); 
      _paniers = _manager.chargerPannierUtilisateur(Session["login"].ToString()); 

      foreach (Bussiness.iPanier p in _paniers) 
      { 
       idPanier = p.id; 
       TablePanier.DataSource = p.Livres; 
       TablePanier.DataBind(); 
      } 
     } 

     else 
     { 
      Response.Redirect("~/Accueil.aspx"); 
     } 
    } 
    protected void btnCommande_Click(object sender, EventArgs e) 
    { 


     foreach (RepeaterItem iter in TablePanier.Items) 
     { 
      // id livre courant 
      if (iter.ItemType == ListItemType.Item || iter.ItemType == ListItemType.AlternatingItem) 
      { 
       string guid = ((HiddenField)iter.FindControl("guid")).Value.ToString(); 
       int nbExemplaires = int.Parse(((System.Web.UI.WebControls.TextBox)iter.FindControl("txtNbExemplaires")).Text.ToString()); 

      } 
     } 
    } 
} 

正如你所看到的,中繼器的構造層次的約束。我試圖在頁面的按鈕上發生事件時讀取數據。

有什麼想法?

+0

代碼看起來不錯 - ?你從哪裏打電話嗎?如果在中繼器數據綁定之前調用它,則控件將不具有值。 – Ray 2010-04-04 11:56:56

+0

我沒有看到您粘貼的代碼有任何問題。當你說這些數值「沒有正確讀取」時,你是什麼意思? – 2010-04-04 11:57:03

+0

@Ray:中繼器數據綁定後。 @Matti virkkunen:值不讀取! – 2010-04-04 12:14:03

回答

3

有幾件事情要檢查:

  • 中繼器在Page_Load中綁定上都INTIAL請求,並在回發。所以當一個按鈕點擊該頁面時,中繼器會重新加載原始數據。用戶輸入的任何內容都會丟失。這是你想要的嗎?如果不是,請使用IsPostBack屬性將其加載到GET請求上。

  • 如果會話[「登錄」]爲空,你的中繼器不會被加載 - 我認爲你已經檢查過了嗎?

  • 在您的發佈代碼中,您沒有對您嘗試從中繼控件獲取的值進行任何操作。這是因爲沒有顯示額外的代碼?

  • 您是否使用過調試器來檢查FindControl所發現的控件,以確保它們存在,它們是您認爲它們是什麼?

  • 當你說「值不讀」,你的意思是你得到空值空字符串

+0

謝謝!第一點解決了我的問題! – 2010-04-04 21:37:33

2

檢查項目類型 - 您應該查找或項目或交替項目類型。

if (iter.ItemType == ListItemType.Item || iter.ItemType = ListItemType.AlternatingItem) { 
// find controls and do something 
} 
6

取決於您擁有控件的位置。

請注意,中繼器有一個HeaderItemTemplate,ItemTemplate & AlternateItemTemplate & FooterItemTemplate。由於這個原因,當您迭代中繼器的Item集合時,您需要知道在訪問控件對象之前要查找哪些模板。

通常,您將需要如下代碼:

foreach(RepeaterItem item in TablePanier.Items){ 

if(item.ItemType == ListItemType.HeaderItem){ 
    // do something with the header 
} 
else if(item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem){ 
    // do something with the item 
    var guid_control = item.FindControl("guid") as HiddenField; 
    var nbExemplaires = item.FindControl("txtNbExemplaires") as TextBox; 
} 
else if(item.ItemType == ListItemType.FooterItem){ 
    // do something with the footer 
} 

HTH。 }