2008-12-08 2 views
1

Il est temps de montrer mon manque total de connaissances pour tout ce qui concerne les formulaires Web, mais c'est parti. J'étend le contrôle de panneau et OnPreRender plaçant quelques contrôles supplémentaires à l'intérieur de lui (disons juste 1 zone de texte pour la simplicité). De là, je laisse juste la méthode Panels Render faire sa chose. Le problème que j'éprouve est que, évidemment, à chaque fois que ce contrôle est rerendered, il reste simplement ce même TextBox dans le panneau avec la valeur que je code dans la méthode OnPreRender. Maintenant, je ne veux pas vraiment repeupler le panneau chaque fois,Commandes du serveur et état de la vue

Je veux coller le contorl textbox là-bas sur le premier chargement et les avoir rechargés à partir des caches control/viewstate. Dans ce cas avec mon exemple de coller une seule zone de texte dans le panneau, si la valeur de la zone de texte change et qu'une publication se produit, je veux que cette valeur reste la valeur modifiée.

Des trucs web de base vraiment connus, mais je n'ai jamais eu besoin de créer des contrôles personnalisés dans mon temps. Toute aide appréciée.

Chris.

Répondre

3

Vous devez (re) créer le contrôle enfant (la zone de texte) dans OnInit - afin qu'il soit présent lors de l'appel de LoadViewState et de ProcessPostBackData.

Voir le server control lifecycle pour plus d'informations.

+0

Salut, c'est correct. – Owen

+0

Si vous utilisez des formulaires Web, RUN DO WALK et lisez sur les cycles de vie dans ASP.NET. Vous sauvera beaucoup de chagrin d'amour. – Will

0

À l'intérieur de votre code, vous devrez gérer la restauration des informations de viewstate si vous avez besoin des services de viewstate. Un bon exemple est ici View State example par Microsoft. Il y a quelques autres éléments référencés dans l'exemple de code, mais cela devrait vous permettre de suivre le bon chemin.

1

Les contrôles dynamiques dans ASP.NET sont difficiles, en particulier si vous êtes nouveau sur les formulaires Web et le cycle de vie de la page. Si vous pouvez éviter les contrôles dynamiques, faites-le. Utilisez controlName.Visible = false et d'autres astuces à la place.

Si vous devez ensuite lire this article. Règle de base, ajoutez des contrôles au début du cycle de vie de la page, référencez-les plus tard dans le cycle de vie de la page. PreRender est presque la fin, un endroit peu commun à ajouter et à utiliser des contrôles.

1

Je ne sais pas si cela s'applique à toutes les versions de .Net (je pense 2.0 ou ultérieur) mais il existe une méthode appelée CreateChildControls qui ne fait pas vraiment partie du cycle de vie, elle est appelée à chaque fois que la méthode EnsureChildControls est appelé. Par défaut, il est appelé avant PreRender s'il ne s'agit pas d'une publication. Donc, fondamentalement votre code ressemblerait à ceci:

public class SomeControl : WebControl, INamingContainer 
{ 
    private TextBox someTextBox; 

    protected override void CreateChildControls() 
    { 
    base.CreateChildControls(); 

    someTextBox= new TextBox(); 
    someTextBox.ID = "tbxMain"; 

    Controls.Add(textboxToCheck); 
    } 
} 

Maintenant, la partie à ne pas est que si vous appelez EnsureChildControls, vous ne pouvez pas être sûr à 100% que les contrôles existent avant que les propriétés publiques sur votre contrôle sont remplies par la charge ViewState. Qu'est-ce que ça veut dire? Eh bien prendre le code d'avant et d'ajouter une propriété pour la CssClass:

public class SomeControl : WebControl, INamingContainer 
{ 
    private TextBox someTextBox; 

    protected override void CreateChildControls() 
    { 
    base.CreateChildControls(); 

    someTextBox= new TextBox(); 
    someTextBox.ID = "tbxMain"; 

    Controls.Add(textboxToCheck); 
    } 

    public String CssClass { get; set; } 
} 

En CreateChildControls vous ne voudrez pas ceci:

someTextBox.CssClass = CssClass; 

Comme il n'y a aucun moyen d'être sûr que le contrôle existe encore.Il y a quelques façons que vous pouvez manipuler ceci:

Chaîne CssClass publique {{ se EnsureChildControls(); return someTextbox.CssClass; }

set 
{ 
    EnsureChildControls(); 
    someTextbox.CssClass = value; 
} 

Dans cet exemple, je fais appel EnsureChildControls (En supposant que vous réglez l'cssValue sur la zone de texte dans la méthode CreateChildControls) et de fixer ou de la zone de texte.

Une autre façon est de mettre tout ce qui dépend des propriétés publiques du contrôle dans la méthode OnPreRender:

protected override void OnPreRender(EventArgs e) 
{ 
    someTextbox.CssClass = CssClass; 
} 

Ainsi éviter le désordre de se soucier de la propriété étant rempli déjà pendant la charge ViewState.

One Note:

L'utilisation de INamingContainer peut être important. Fondamentalement, tout ce qui fait est de s'assurer que les contrôles sur le contrôle parent ont un identifiant qui est unique sur la page en appliquant le nom du parent (Et peut-être plus) à l'id. Fondamentalement, si l'ID parent est Parent et que l'ID de contrôle enfant est Child, l'ID peut apparaître en tant que Parent_Child. Cela résoudra des problèmes avec ViewState ne peuplant pas les propriétés correctement ou pas du tout.

Questions connexes