2009-09-16 3 views
0

J'ai ce problème étrange lorsque vous placez des zones de texte sur la page à l'envers. L'ensemble du système d'événements est foiré. La modification d'une zone de texte déclenche TextChange sur toutes les zones de texte. Je peux résoudre ce problème en plaçant d'abord les commandes dans une liste, puis en appelant la commande add tout en parcourant la liste à l'envers. Mais je veux juste savoir pourquoi cela échoue. Heres un code (.net 2,0)ASP.NET mettre des contrôles dynamiques sur la page en inversant les événements

public partial class _Default : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     InitFields(); 
    } 

    private void InitFields() 
    { 
     int nrFields; 
     //We have a static textbox called nrElements, this determines the number 
     //of fields to initialize 
     if (int.TryParse(nrElements.Text, out nrFields)) 
     { 
      //Put all the dynamic fields on the screen in reverse order 
      foreach(Control t in GetDynamicFields(nrFields)) 
      { 
       //Calling Controls.Add works fine 
       //Calling Controls.AddAt messes up the events 
       //Try changing different textboxes 
       plhFields.Controls.AddAt(0, t); 
      } 
     } 
    } 

    private IEnumerable<Control> GetDynamicFields(int nrFields) 
    { 
     for (int i = 0; i < nrFields; i++) 
     { 
      TextBox txtBox = new TextBox(); 
      txtBox.ID = string.Format("dynTextBox{0}", i.ToString()); 
      txtBox.AutoPostBack = true; 
      txtBox.TextChanged += t_TextChanged; 
      yield return txtBox; 
     } 
    } 

    private void t_TextChanged(object sender, EventArgs e) 
    { 
     TextBox txtBox = sender as TextBox; 
     if (txtBox != null) 
      txtBox.Text = txtBox.Text + "Changed "; 
    } 
} 
+0

Les commandes I chargées dépendent de l'entrée de l'utilisateur dans une autre zone de texte. La valeur de la zone de texte (userinput) n'est pas chargée lors de l'exécution de PreInit. La même chose est vraie pour CreateChildControls. –

Répondre

0

Essayez d'appeler InitFields() sur l'événement Page_PreInit plutôt que Page_Load.

Ou une alternative serait de remplacer les CreateChildControls() méthode (MSDN Article), si vous utilisez CreateChildControls(), vous devez appeler EnsureChildControls() sur la méthode Page_Load pour vous assurer que la méthode CreateChildControls() a été appelé avant d'essayer d'accéder aux contrôles qui ont été créés dans cette méthode. Toujours mettre les contrôles dynamiques dans l'événement OnInit.

+0

Les commandes que je charge dépendent de l'entrée de l'utilisateur dans une autre zone de texte. La valeur de la zone de texte (userinput) n'est pas chargée lors de l'exécution de PreInit. La même chose est vraie pour CreateChildControls. –

+0

Ensuite, les identifiants de contrôle sont-ils les mêmes entre chaque publication? –

0

Ensuite, viewstate serializer/deserializer fonctionnera. Et vous devez ajouter des contrôles à chaque requête, pas seulement dans! IsPostBack.

+0

Comment accéder aux contrôles depuis l'événement OnInit? Appeler txtUserInput.Text ne fonctionne pas –

+0

Eh bien, tous les éléments d'entrée dans le formulaire ne sont pas désérialisés dans l'événement OnInit, donc j'utilise Request.Form ["ctl00_txtInput"] pour lire les zones de texte. Mais "ctl00 _....._ txtInput" n'est pas recommenté car le préfixe "ctl00 _..." peut changer, en fonction de la position de votre zone de texte. Vous pouvez l'utiliser juste pour tester, et vous pouvez trouver le nom en regardant HTML de votre page rendue. En outre, je recommande la méthode d'aide à la construction, qui itère à travers des paires clé-valeur dans Request.Form, et recherche "txtUserInput" dans la clé, et renvoie sa valeur! Je peux poster un code si vous le souhaitez. –

Questions connexes