6
votes

Comment puis-je effacer de manière dynamique toutes les commandes dans un contrôle utilisateur?

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();


1 commentaires

Peut-être que tout ce dont vous avez besoin est une simple redirection?


7 Réponses :


2
votes

Vous pouvez faire

foreach (Control c in myUserControl.Controls) {
    c = new c.Type.GetConstructor().Invoke();
}


3 commentaires

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 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.



1
votes

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();


2 commentaires

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 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 ...



0
votes

Pourquoi ne pas faire comme vous le suggère: xxx

puis mettre en oeuvre effacer: xxx

qui devrait le faire.


2 commentaires

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 est statiquement typé comme Contrôle , par conséquent, la méthode d'extension le rechercherait Contrôle .



1
votes
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.

1 commentaires

Moins 1 parce que la suppression des contrôles n'a rien à voir avec la question initiale.



1
votes

paramètre activerviewstate = "false" 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.


0 commentaires

3
votes

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 () n'importe où ailleurs dans votre code.


1 commentaires

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.



1
votes

Qu'en est-il du Control.clearchVuestate Méthode?

Etats MSDN

supprime les informations d'état de vue pour tous les contrôles enfants du contrôle du serveur.

Je n'ai jamais utilisé cela. Donc, je ne suis pas sûr si cela vous aidera. Cela semble bien, je pense :)


1 commentaires

On dirait que cela devrait être la solution parfaite, mais malheureusement, cela ne fonctionne pas.