Parcours de tous les controles d'une application ? [C#] - C#/.NET managed - Programmation
Marsh Posté le 01-04-2008 à 19:20:46
Application.GetOpenForms() ou un truc du genre, te retourne une collection des forms ouvertes de ton programme.
Si tu veux les forms contenues dans ton assembly, alors il faut les trouver via ce moyen.
Sauf qu'après, je vois pas ce que tu veux en faire, vu que tu peux très bien avoir dans ton code "this.Controls.Add(new Label());" par exemple... (typiquement le cas pour les membres d'un menustrip par exemple)
Code :
|
Marsh Posté le 01-04-2008 à 20:06:19
Et ce code fonctionne aussi si le type se trouve dans une DLL importée en référence ?
Je t'explique un peu le pourquoi de ma demande.
Techniquement, on a développé un module de sécurité où l'on attribue des droits sur des actions (qui se trouvent dans les applications).
Seulement, cela implique de créer les actions dans le module de sécurité, et à la longue c'est très lourd et chiant à gérer (notamment pour le développeur).
L'idéal serait que le développeur développe normalement, c'est à dire, mets ses MenuStrip, ToolbarStrip dans ses forms, et qu'au moment du login au début de l'application, ça va récupérer tous ses menus et vérifier si la hiérarchie de l'application est à jour dans la base de données. Si c'est pas le cas, on met à jour la BDD.
En gros, avoir une génération automatique de la hiérarchie de l'application dans la base de données sans avoir à se casser le cul dans le module de sécurité à ajouter les rubriques et les actions une à une.
Si ce n'est pas clair, dis moi, je ré-expliquerai
Marsh Posté le 01-04-2008 à 20:15:04
nucl3arfl0 a écrit : Et ce code fonctionne aussi si le type se trouve dans une DLL importée en référence ? |
Tu peux récupérer les referenced assemblies de l'assembly courrante, donc je dirais que oui (à condition que tu places ce code dans l'assembly "racine" )
Marsh Posté le 01-04-2008 à 21:55:04
MagicBuzz a écrit : |
Oki merci, je testerai ça demain.... misère misère quand même...
Marsh Posté le 02-04-2008 à 09:44:19
Hello,
bon ça marche en Win (à part si on ajoute des items via le code source et non plus via le mode design), par contre en Web, niet
Marsh Posté le 02-04-2008 à 12:30:14
Code :
|
Calendar c'est un exemple évidemment.
Je veux récupérer toutes mes pages, et dans ces pages, je veux récupérer les controles.
Par contre, je pense que ma façon de procéder là, n'est pas bonne. Du moins, il ne faudrait pas que j'utilise Activator.CreateInstance sur le type page.
Une idée ?
Marsh Posté le 03-04-2008 à 09:26:22
J'ai bloqué là dessus aussi.
J'ai pas trouvé comment rechercher les contrôles contenus dans une classe lorsque cette dernière n'est pas instanciée.
Avec la réflection, j'ai tenté d'aller voir les Properties et les Attributes des pages, mais rien trouvé. Pourtant je pense que c'est plutôt cette piste qu'il faut suivre.
D'un autre côté, créer une instance, c'est garantir d'avoir sous la main les contrôles y compris ceux créés avec des "this.Controls.Add()"
Bonne chance en tout cas
Marsh Posté le 03-04-2008 à 12:13:15
MagicBuzz a écrit : J'ai bloqué là dessus aussi. |
Merci.
Je me suis renseigné sur le forum MSDN US, et quelqu'un a donné la même idée que j'avais au départ:
Parcourir le code source toutes les pages ASPX et récupérer le code "balisé" du contrôle..
Là également, ça pose problème dans le cas d'un menu généré dynamiquement, mais bon, c'est mieux que rien, et ça a l'air de marcher. Quant au temps d'exécution, ça ne se passera qu'au niveau du développeur, donc aucune incidence pour le client.
Merci Microsoft qui nous pousse à programmer comme des cochons
Edit: Quant à la reflection, c'était une piste pour le Win, car quand on glisse et dépose le composant dans la form, VS sauvegarde les informations dans le désigner. Ce qui fait que quand tu instancies la form dynamiquement, tu peux récupérer ces attributs.
En revanche, pour le web, ce n'est pas possible. Quand on glisse et dépose le composant dans la page, c'est uniquement le code ASP qui est généré. Et dans ce cas là, l'objet n'est instancié qu'au runtime avec ses attributs.
Et comme dans la reflection tu dois lui passer le type pour l'instanciation, ta page n'hérite que de la classe "System.Web.UI.Page", et cette instanciation te donne qu'une page vierge sans attributs...
Marsh Posté le 03-04-2008 à 17:57:05
nucl3arfl0 a écrit : |
c'est l'hopital qui se fout de la charité là, avec l'usine à gaz que tu veux monter
Marsh Posté le 03-04-2008 à 19:23:46
Moi je me base sur les contraintes qu'on me donne
Vaut mieux avoir une usine à gaz qui fonctionne que rien du tout
Ah et j'ai déjà retourné le problème en long en large et en travers, j'peux pas faire mieux, le reste ne dépendant pas de moi..
Marsh Posté le 03-04-2008 à 23:30:58
Un truc pas trop crade serait j'imagine quelquechose de ce genre :
Projet "Web Control Collection" :
Code :
|
Projet "Web Site", référençant le premier :
Code :
|
+ default.aspx.cs tout vide chez moi
Code :
|
J'ai ça à la racinde de mon site
Et ça me permet, via mon fichier XML de décider quels champs s'affichent ou non, en prenant le pas sur ce que je peux tenter de vouloir faire au niveau programmation dans la page.
Marsh Posté le 03-04-2008 à 23:33:20
Mais bon, ça nécessite quand même quelques changements dans le code existant, et surtout, ça n'empêche pas un développeur d'utiliser les contrôles standards plutôt que ceux-ci.
Marsh Posté le 01-04-2008 à 15:30:18
Hello,
je vous explique un peu le contexte.
L'idée est de simplifier la vie du développeur.
Exemple:
Générer automatiquement la hierarchie d'une application dans la base de données à partir des Menu présents dans les forms (et page).
Ceci nécessite un parcourt de tous les controles de l'application.
Sauf qu'à l'heure actuel, je ne sais faire un parcourt que d'une form courante.
Il est évidemment probablement qu'une form non instanciée contienne un menu et que je dois également récupérer ce dernier.
Alors ma question est simple, comment faire ça (si c'est possible) ?
Autre idée, à chaque fois que je "drag'n drop" un menu sur une form, j'enregistre un lien vers cet objet dans un control global de l'application (en mode design).
L'idéal serait d'avoir juste à parcourir les menus stockés dans ce contrôle pour récupérer leur contenu et mettre à jour la base de données.
Et là non plus, je ne vois pas comment faire, car les élements n'étant pas instanciés ça coince...
Merci pour votre aide