2009-03-19 4 views
0

J'essaie de faire quelque chose que j'ai été historiquement disponible à faire en utilisant Visual FoxPro (VFP). En utilisant une fonction "SETALL()", je suis capable de faire quelque chose comme se rapportant à un formulaire courant ... this.SetAll ("someProperty", "toSomeNewValue") et il passe à travers et assigne la valeur à tous les contrôles. En créant ma propre propriété personnalisée et une interne à VFP via "_assign", provoquera le déclenchement de ces événements. À partir de cette méthode, chaque contrôle prendrait soin de lui-même sur le formulaire, de enable/disable/visibility, modifiable, readonly, couleur, police, validation, etc., basé sur ce que j'ai mis dans chaque contrôle individuel. Donc, comment pourrais-je faire une chose similaire en C# ... Comme avoir une propriété publique, ou une méthode, ou un délégué au niveau du formulaire, comme "FormEditMode". Ensuite, quand je fais quelque chose comme this.FormEditMode = AddMode, tous les contrôles seront auto-déclenchés pour se activer/désactiver, activer/désactiver respectivement à la place des appels explicites pour tous les contrôles sur un formulaire donné.Délégation de contrôle sur le changement d'une valeur/propriété

Merci

Répondre

0

Je l'ai vraiment résolu en obtenant chaque contrôle auto-enregistré à la fin de l'appel InitialzeComponents() du formulaire, et une combinaison d'autres morceaux que j'ai lus dans ma recherche d'une solution. Après la construction de mon formulaire de base, zone de texte, contrôles d'étiquette (et autres), après le InitializeComponents(), je fais un appel récursif pour chaque contrôle sur le formulaire et enregistre sa méthode dans le délégué/événement du formulaire. Ensuite, lors d'un appel pour modifier le mode d'édition du formulaire, il appelle l'appel de délégué et déclenche la fonction de contrôle de chaque individu. Donc, je reçois un meilleur contrôle sur les transferts de délégué/événement, et maintenant l'appel récursif. Ceci est fait UNE FOIS à l'avance, donc je n'ai pas besoin de continuer à vérifier et à appeler de façon récursive pendant le clic d'un bouton, ou une autre condition pour faire défiler les contrôles chaque fois que je dois faire quelque chose.

1

Je voudrais juste faire quelque chose comme ceci:

this.Visible = false; 
Controls.ForEach<Control>(c => c.Visible = false); 

Si vous avez boîtes de groupes ou d'autres contrôles qui ont des contrôles, vous voudrez peut-être mettre cela en une fonction récursive:

static void DoForEachControl(Control control, Action<Control> f) 
{ 
    control.Controls.ForEach<Control>(c => 
             { 
             f(c); 
             DoForEachControl(c, f); 
             }); 
} 

Pour obtenir ce ForEach, vous aurez besoin de quelque chose comme ceci:

public static class Extensions 
    { 
    public static void ForEach<T>(this IEnumerable source, Action<T> action) 
    { 
     foreach (var item in source) 
     { 
     action((T)item); 
     } 
    } 
    } 
Questions connexes