est-il possible de nettoyer de manière dynamique (et génériquement) l'état de tous les contrôles enfants de l'utilisateur? (par exemple, toutes ses zones de texte, toutes ses goûteries, des radiobuttons, des datagramrids, des répéteurs, etc. Fondamentalement tout ce qui a ViewState)
J'essaie d'éviter de faire quelque chose comme ceci: P>
foreach (Control c in myUserControl.Controls) c.Clear();
7 Réponses :
Vous pouvez faire
foreach (Control c in myUserControl.Controls) { c = new c.Type.GetConstructor().Invoke(); }
Je pense que Michael cherche à effacer les valeurs / l'état dans chaque contrôle. Pas les contrôles eux-mêmes de la collection.
KP: Correct. Je ne veux pas Supprimer i> les commandes, simplement les effacer (par exemple, claire une valeur de texte de zone de texte, effacer l'élément sélectionné dans une dépose déroulante, effacer le contenu d'un Datagramrid / répéteur, etc.).
Nilbert: Aucun problème, merci pour votre contribution, peu importe. J'aime où tu vas avec le concept de réflexion; C'est le genre de chose que je me demandais.
Je ne l'ai pas testé, mais il est possible de nettoyer la vieilleté de l'UserControl. Vous pouvez également exposer une méthode personnalisée sur le contrôle de l'utilisateur également:
USERCONTROL: P>
myUserControlInstance.Clear();
Hmmm .. Testé cela moi-même et ne semble pas fonctionner .. Je vais jouer avec elle un peu plus longtemps que j'aime le concept ..
J'ai sauté le pistolet. ViewState Code> n'est pas une propriété publique pour que vous ne puissiez pas simplement l'effacer pour les contrôles. J'aime l'idée de la récursion discutée dans l'autre réponse ... Je laisserai cette réponse même si cela ne fonctionnera pas au cas où d'autres ont la même pensée ...
Pourquoi ne pas faire comme vous le suggère: puis mettre en oeuvre effacer: p> qui devrait le faire. P> p>
Donc, chaque appel à effacer () dans le forach appellera le contrôle statique.clear ()? Donc, pour le faire fonctionner, vous seriez de retour au "if (c isbox) ..." à l'intérieur du contrôle.clear ()? En effet, pas une bonne solution alors.
Correct. C CODE> est statiquement typé comme
Contrôle code>, par conséquent, la méthode d'extension le rechercherait
Contrôle code>.
myUserControl.Controls.ToList().ForEach(c => myUserControl.Controls.Remove(c)); However, be careful, because you modify the iterating list. This could lead to some strange behaviour.
Moins 1 parce que la suppression des contrôles n'a rien à voir avec la question initiale.
paramètre activerviewstate = "false" code> sur les contrôles individuels peut vous faire économiser le travail, s'il ne cause pas d'autres problèmes pour vous dans ce cas. P>
J'allais suggérer une solution similaire à celle de la tâche, sauf (comme indique SIXLETERTERTERVARIABLES), nous devons l'implémenter sous forme de méthode d'extension et basculer essentiellement sur le type précis du contrôle transmis (c.-à-d. Copier votre logique que vous avez publiée dans Votre question) et vous pouvez bien sûr appeler maintenant contrôler.clear () code> n'importe où ailleurs dans votre code. p> p>
J'ai accepté cette réponse parce que je pense que c'est aussi proche que possible d'arriver à mon intention initiale. Malheureusement, il semble qu'il n'y ait pas de manière parfaitement dynamique de nettoyer tous les contrôles de l'enfant.
Qu'en est-il du Control.clearchVuestate Méthode? P>
Etats MSDN P>
supprime les informations d'état de vue pour tous les contrôles enfants du contrôle du serveur. P> blockQuote>
Je n'ai jamais utilisé cela. Donc, je ne suis pas sûr si cela vous aidera. Cela semble bien, je pense :) p>
On dirait que cela devrait être la solution parfaite, mais malheureusement, cela ne fonctionne pas.
Peut-être que tout ce dont vous avez besoin est une simple redirection?