2009-03-09 8 views
1

Edit: si quelqu'un pourrait aussi suggérer une façon plus raisonnable de faire ce que je suis en train ci-dessous pour arriver, ce serait aussi très appréciéCollecte de données: texte dynamique Boîtes

Je construis une forme multiPage cela prend une quantité (de produit) à partir d'une méthode POST et affiche une séquence de formulaire en fonction de ce nombre. lorsque l'utilisateur va à la page suivante, le formulaire est censé collecter ces informations et les afficher (pour confirmation), qui enverra ensuite ces informations à un service qui fournira les URL à afficher. Inutile de dire que j'ai du mal à faire ce travail. Voici les parties pertinentes de mon (anonymisées) Code:

public partial class foo : System.Web.UI.Page 
{ 
    Int quantityParam = 3; 
    ArrayList Users = new ArrayList(); 
    //the information for each user is held in a hashtable the array list will be an array list of the user hashtables 


protected void Page_Init(object sender, EventArgs e) 
{ 
    if(null != Request["quantity1"]) 
     { 
      this.quantityParam = Request["quantity1"]; 
     } 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    int quantity = this.quantityParam; 
    if(quantity < 1){ mviewThankYou.SetActiveView(View4Error);} 
    else 
    { //create a form for each user 
     mviewThankYou.SetActiveView(View1EnterUsers); 
     for(int user = 0;user < quantity; user++) 
     { 
      createUserForm(user);  
     } 
    } 
} 
protected void BtnNext1_Click(object sender, EventArgs e) 
{ 
    if(Page.IsValid) 
    { 
     for(int i = 0; i < quantity; i++) 
     { 
      String ctrlName = "txtUser" + i.ToString(); 
      String ctrlEmail = "txtEmail" + i.ToString(); 
      TextBox name = (TextBox)FindControl(ctrlName); 
      TextBox email = (TextBox)FindControl(ctrlEmail); 

      /*BONUS QUESTION: How can I add the Hashtables to the Users Array without them being destroyed when I leave the function scope? 

      this is where the failure occurs: 
      System.NullReferenceException: Object reference not set to an instance of an object. on: "tempUser.Add("name",name.Text); 
      */ 

      Hashtable tempUser = new Hashtable(); 
      tempUser.Add("name",name.Text); 
      tempUser.Add("email",email.Text); 
      this.Users.Add(tempUser); 
     } 
     for(int i = 0; i < quantity; i++) 
     { 
      v2Content.Text +="<table><tr><td>Name: </td><td>"+ 
      ((Hashtable)Users[i])["name"]+ 
      "</td></tr><tr><td>Email:</td><td>"+ 
      ((Hashtable)Users[i])["email"]+ 
      "</td></tr></table>"; 
     } 
     mviewThankYou.SetActiveView(View2Confirm); 
    } 
} 
private void createUserForm(int userNum){ 
    DataTable objDT = new DataTable(); 
     int rows = 2; 
     int cols = 2; 

    //create the title row.. 
    TableRow title = new TableRow(); 
    TableCell titleCell = new TableCell(); 
    formTable.Rows.Add(title); 
    Label lblUser = new Label(); 
    lblUser.Text = "<b>User "+ (userNum+1) + "</b>"; 
    lblUser.ID = "lblTitle"+ userNum; 
    titleCell.Controls.Add(lblUser); 
    title.Cells.Add(titleCell); 

    for(int i = 0; i < rows; i++) 
    { 
     TableRow tRow = new TableRow();  
     formTable.Rows.Add(tRow); 
     for(int j = 0; j < cols; j++) 
     { 
      TableCell tCell = new TableCell(); 
      if(j == 0){ 
       Label lblTitle = new Label(); 
       if(i == 0){ 
        lblTitle.Text = "User Name:"; 
        lblTitle.ID = "lblUser" + userNum; 
       } 
       else{ 
        lblTitle.Text = "User Email:"; 
        lblTitle.ID = "lblEmail" + userNum; 
       } 
       tCell.Controls.Add(lblTitle); 
      } else { 
       TextBox txt = new TextBox(); 
       if(i==0){ 
        txt.ID = "txtUser" + userNum; 
       } 
       else{ 
        txt.ID = "txtEmail" + userNum; 
       } 
       RequiredFieldValidator val = new RequiredFieldValidator(); 
       val.ID = txt.ID + "Validator"; 
       val.ControlToValidate = txt.UniqueID; 
       val.ErrorMessage = "(required)"; 

       tCell.Controls.Add(txt); 
       tCell.Controls.Add(val); 
      } 
      tRow.Cells.Add(tCell); 
     }//for(j) 
    }//for(i) 

    //create a blank row... 
    TableRow blank = new TableRow(); 
    TableCell blankCell = new TableCell(); 
    formTable.Rows.Add(blank); 
    Label blankLabel = new Label(); 
    blankLabel.Text = " "; 
    blankLabel.ID = "blank" + userNum; 
    blankCell.Controls.Add(blankLabel); 
    blank.Cells.Add(blankCell);   

}//CreateUserForm(int) 

Désolé pour le montant de noueux (code amateur). Ce que je soupçonne en cas d'échec est que FindControl() ne fonctionne pas, mais je ne peux pas comprendre pourquoi ...

Si toute aide peut être donnée, je serais très reconnaissant.

Edit: montrant l'erreur pourrait aider:

erreur (ligne 112) Détails de l'exception: System.NullReferenceException: référence d'objet non définie à une instance d'un objet.

Erreur Source:

Ligne 111: Hashtable tempuser = new Hashtable();
Ligne 112: tempUser.Add ("nom", nom.Texte);
Ligne 113: tempUser.Add ("email", email.Text);
Ligne 114: this.Users.Add (tempUser);

+0

« Ce que je soupçonne que si défaut est que FindControl() ne fonctionne pas, mais je ne peux pas comprendre pourquoi ... », s'il vous plaît exécuter sur le débogueur, vous serez en mesure de dire quelle ligne à coup sûr, alors vous pouvez revenir si vous ne comprenez toujours pas – eglasius

+0

ou publiez les deux fichiers? – BenB

+0

FindControl() recherche un contrôle créé dans createUserForm() spécifiquement à partir du code qui démarre: ... Libellé lblTitle = new Label(); et se termine tCell.Controls.Add (txt) ...(trop long pour commenter) quel autre fichier dois-je poster? (Je pense aussi FindControl() échoue, mais ne peut pas voir pourquoi ...) – matthewdunnam

Répondre

0

I figured it out:

FindControl() fonctionne comme une recherche directe des enfants du contrôle, il est appelé.

quand je l'appelais, il était (automatiquement) Page.FindControl() j'avais emboîtés la création de la table dans un champ et un contrôle Tableau

quand j'ai appelé tableID.FindControl(), il a trouvé les commandes juste Comme il se doit.

Merci pour l'aide, Gregory, et pour tous les commentaires tout le monde.

-Matt

0

Votre problème vient du fait que vous rechargez le formulaire à chaque fois dans Page_Load. Assurez-vous de ne charger qu'une seule fois les zones de texte dynamiques et de les retrouver lorsque vous en aurez besoin pour confirmation. Tant que Page_Load reconstruit, vous ne trouverez pas la réponse et vous risquez de ne rien trouver.

+0

alors que c'est un bon point et j'ai fait le changement, il n'a pas résolu le problème. – matthewdunnam

Questions connexes