2017-02-02 2 views
0

Je viens de commencer à réécrire une application de vba (Access) vers vb.net + SQLServer donc pas très expérimenté dans .net.Existe-t-il un moyen de consolider l'itération à travers des contrôles de formulaire pour différentes activités

Je crée des contrôles personnalisés (Formulaire + contrôles de formulaire) avec un certain nombre de propriétés supplémentaires PrevValue, Modifié (similaire à celui de TextBox), Dirty, DirtyEnabled, SQLColumnName, SQLTableName pour activer AutoUpdating et annuler dans mes formes le formulaire expose les propriétés IsDirty, Initialising et Isready et une méthode d'annulation.

Ce faisant, il se produit que je dois écrire 3 fois le même code d'itération dans différents endroits:

For each Ctrl as Control in frm.Controls ' frm being a reference to the form 
    if typeOf Ctrl is MyTextBox 
     with DirectCast(Ctrl, MyTextBox) 
      ' here comes the variable code depending what needs to be done 
     end with 
    elseif TypeOf Ctrl is MyComboBox 
    ' etc.... for MyListBox, MyCheckBox etc.... 

J'ai aussi un certain nombre de contrôles personnalisés MyNumBox et MyDateBox héritant de MyTextBox mais avec un comportement modifié (Évaluation de la formule, manipulation de la date, calendrier ...) Comment puis-je éviter de faire un test supplémentaire sur eux.

Une version de cette itération se trouve dans la classe SQLProcessClass où les contrôles modifiés sont ajoutés en tant que SQLParameter et après itération appelant SQLProcessClass Update ou Insert, mais ... après une activité SQL réussie, je dois à nouveau parcourir les contrôles pour réinitialiser le drapeau modifié pour chaque contrôle. Ailleurs, j'en ai besoin pour implémenter un formulaire annuler pour réinitialiser tous les contrôles à leurs valeurs précédentes.

Il me semble que j'ai deux options 1. répéter ce code d'itération partout où j'ai besoin de parcourir les contrôles de formulaires. Je ne l'aime pas comme chaque fois que je devrais créer un nouveau contrôle personnalisé, je dois ajouter quelques lignes X dans différents modules/classes ... très mauvaise programmation 2. Créer une procédure d'itération de formulaire contenant toutes les différentes activités qui appartient normalement à une autre classe dans cette procédure "centralisée", cela pourrait être mieux alors (1) mais je ne l'aime pas beaucoup non plus.

Existe-t-il une meilleure façon de le faire en utilisant certaines fonctionnalités .net que je ne maîtrise pas encore?

Merci pour tout conseil.

+0

'Pour chaque ctrl comme MyTextBox Dans frm.Controls.OfType (Of MyTextBox)' ... serait bouclé sur ce type et lancer 'ctrl' comme ce type; vous auriez à faire plusieurs boucles si. – Plutonix

+0

@plutonix, merci pour votre réponse mais cela ne changera pas la logique et la nécessité de copier et coller le même code à différents modules pour la mise en œuvre –

Répondre

0

L'itération de contrôles peut être difficile car les contrôles sont souvent imbriqués. Une approche plus contrôlée serait d'ajouter un autre objet de collection à votre formulaire où vous conservez des références à vos contrôles ajoutés .....

par exemple

Dim My_Widgets as New List(of Your-Control-Class-Name) 

Ensuite, lorsque vous créez les contrôles à la forme ajouter eux à cette liste.

My_Widgets.Add(Widget_Object) 

Ensuite, il est simple d'itérer dans cette liste.

For Each Widget as My_Widget_CLass in My_Widgets 
    ' do what you need to do to Widget 
Next 

Si vous avez besoin de faire référence à des contrôles individuels directement, utilisez un objet dictionnaire à la place ..

par exemple

Dim My_Named_Widgets as new Dictionary(of String, Your-Control-Class-Name) 

Ensuite, ajoutez vos références de commande au dictionnaire par nom

My_Named_WIdgets.add("<Whatever_You_USe_To_Identify_It>", Widget_Object) 

Vous pouvez ensuite faire référence au contrôle spécifique par l'ID ou le nom

My_Names_Widgets("ID").Property = Whatever '... etc 

Vous semblez indiquer que vous avez autres contrôles à d'autres fins, il serait prudent de créer des collections similaires pour chaque type.

+0

Idée originale mais qui ne changerait pas la logique du programme ie je devrais parcourir chaque collection individuellement .... et il faudrait changer la collection correcte pour tout changement dans la structure de la forme (dangereux pour la maintenance). Je préfère l'itération récursive pour les contrôles imbriqués –