Question

Edit: si quelqu'un pouvait également suggérer un moyen plus judicieux de concrétiser ce que j'essaye ci-dessous, cela serait également très apprécié

Je construis un formulaire multi-page qui prend une quantité (de produit) d'une méthode POST et affiche une séquence de formulaire en fonction de ce nombre. lorsque l'utilisateur accède à la page suivante, le formulaire est censé collecter ces informations et les afficher (pour confirmation), qui les enverra ensuite à un service fournissant les URL à afficher.

Inutile de dire que j'ai du mal à faire fonctionner ce travail. Voici les parties pertinentes de mon code (anonymisé):

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 la quantité dérisoire de (code amateur). Ce que je soupçonne en cas d’échec, c’est que FindControl () ne fonctionne pas, mais je ne peux pas comprendre pourquoi ...

si de l'aide peut être donnée, je serais très reconnaissante.

Modifier: afficher l'erreur pourrait aider:

Erreur (ligne 112) Détails des exceptions: System.NullReferenceException: la référence à un objet n'est pas définie sur une instance d'un objet.

Erreur source:

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

Était-ce utile?

La solution 2

Je l'ai compris:

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

quand je l'appelais, c'était (automatiquement) Page.FindControl () que j'avais imbriqué la création de la table dans un champ et un champ Table

quand j'ai appelé tableID.FindControl (), il a trouvé les contrôles tels quels.

Merci pour votre aide, Gregory, et pour tous les commentaires.

-Matt

Autres conseils

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 dynamique et de pouvoir les retrouver lorsque vous en aurez besoin pour confirmation. Tant que Page_Load reconstruira, vous ne trouverez pas de réponse et vous risquez de ne rien trouver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top