2010-04-04 4 views
1

Ce que je suis en train de faire est itérer à travers un répéteur et lire quelques valeurs contrôles:ASP .NET - Comment parcourir un répéteur?

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()); 

    } 

Comme vous pouvez le voir, j'ai un HiddenValue et une zone de texte. Malheureusement, cela ne fonctionne pas, les valeurs ne sont pas lues correctement.

Qu'est-ce qui ne va pas?

Merci!

EDIT: Voici le code complet de la forme:

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()); 

      } 
     } 
    } 
} 

Comme vous pouvez le voir, le répéteur est lié au niveau du constructeur. Et j'essaye de lire les données quand un événement se produit sur un bouton de la page.

Une idée?

+0

le code semble correct -? Où vous appelez à partir?Si vous l'appelez avant que le répéteur soit lié aux données, les contrôles n'auront pas encore de valeurs. – Ray

+0

Je ne vois rien de mal avec le code que vous avez collé. Que voulez-vous dire quand vous dites que les valeurs ne sont pas lues correctement? –

+0

@Ray: après que le répéteur est lié aux données. @Matti virkkunen: Les valeurs ne sont pas lues! –

Répondre

3

Quelques choses à vérifier:

  • le répéteur est lié à Page_Load à la fois sur la demande intial et postback. Ainsi, lorsqu'un bouton clique sur la page, le répéteur est rechargé avec les données d'origine. Tout ce qui est entré par l'utilisateur est perdu. c'est ce que tu veux? Sinon, utilisez la propriété IsPostBack pour le charger uniquement sur la requête GET. Si Session ["login"] est null, votre répéteur ne sera pas chargé - Je présume que vous avez vérifié cela?

  • Dans votre code affiché, vous ne faites rien avec les valeurs que vous essayez d'obtenir à partir des contrôles du répéteur. Est-ce parce que du code supplémentaire n'est pas affiché?

  • Avez-vous utilisé le débogueur pour inspecter les contrôles trouvés par FindControl pour s'assurer qu'ils existent et qu'ils sont ce que vous pensez qu'ils sont?

  • quand vous dites « les valeurs ne sont pas lus », voulez-vous dire que vous obtenez des valeurs nulles Les chaînes vides

+0

Merci! Le premier point a résolu mon problème! –

2

Vérifiez le type d'article - vous devriez chercher, ou un article ou un type d'article alternatif.

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

Dépend de l'endroit où vous avez les contrôles.

S'il vous plaît noter que le répéteur a un HeaderItemTemplate, ItemTemplate & AlternateItemTemplate & FooterItemTemplate. Pour cette raison, lorsque vous parcourez la collection d'articles du répéteur, vous devez connaître les modèles que vous recherchez avant d'accéder à l'objet du contrôle.

En général, vous devrez code comme:

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