2009-08-15 9 views
4

Je me demandais juste si je faisais ça de la bonne façon. J'ai 2 forme un formulaire parent et un formulaire enfant (boîte de dialogue d'options). Pour modifier une propriété sous ma forme de parent de mon formulaire enfant-je utiliser le code comme ceci:Quelle est la bonne façon de modifier les propriétés d'un formulaire parent à partir d'un formulaire enfant?

// Create an array of all rich textboxes on the parent form. 
var controls = this.Owner.Controls.OfType<RichTextBox>(); 

foreach (var item in controls) { 
    if (chkDetectUrls.Checked) 
     ((RichTextBox)item).DetectUrls = true; 
    else 
     ((RichTextBox)item).DetectUrls = false; 
} 

Je n'ai qu'un RichTextBox sur ma forme. Il semble stupide d'avoir à boucler un tableau de 1 contrôle. Est-ce la bonne façon de le faire ou existe-t-il un moyen plus facile?

Répondre

9

Il n'est pas approprié de modifier les propriétés d'un formulaire parent. Au lieu de cela, votre formulaire enfant devrait déclencher un événement que le formulaire parent écoute, et modifie sa propre valeur en conséquence. La manipulation de la forme parente à partir de l'enfant crée un couplage bidirectionnel - la forme parente possède l'enfant, mais l'enfant a également une connaissance intime et dépend de la forme parente. Le bullage est la solution établie, car il permet à l'information de circuler vers le haut («bouillonner») tout en évitant tout couplage strict.

Voici l'exemple le plus élémentaire de l'événement. Cela n'inclut pas le fait de transmettre des informations spécifiques à l'événement (ce dont vous pourriez avoir besoin) mais couvre le concept.

Dans votre formulaire enfant:

//the event 
public event EventHandler SomethingHappened; 

protected virtual void OnSomethingHappened(EventArgs e) 
{ 
    //make sure we have someone subscribed to our event before we try to raise it 
    if(this.SomethingHappened != null) 
    { 
     this.SomethingHappened(this, e); 
    } 
} 

private void SomeMethod() 
{ 
    //call our method when we want to raise the event 
    OnSomethingHappened(EventArgs.Empty); 
} 

Et dans votre formulaire parent:

void OnInit(EventArgs e) 
{ 
    //attach a handler to the event 
    myChildControl.SomethingHappened += new EventHandler(HandleSomethingHappened); 
} 

//gets called when the control raises its event 
private void HandleSomethingHappened(object sender, EventArgs e) 
{ 
    //set the properties here 
} 

Comme je l'ai dit plus haut, vous avez probablement besoin de passer des informations spécifiques à votre événement. Nous pouvons le faire de plusieurs façons, mais la plus simple consiste à créer votre propre classe EventArgs et votre propre délégué. Il semble que vous devez spécifier si une valeur est définie sur true ou false, alors utilisons que:

public class BooleanValueChangedEventArgs : EventArgs 
{ 
    public bool NewValue; 

    public BooleanValueChangedEventArgs(bool value) 
     : base() 
    { 
     this.NewValue = value; 
    } 
} 

public delegate void HandleBooleanValueChange(object sender, BooleanValueChangedEventArgs e); 

Nous pouvons changer notre événement pour utiliser ces nouvelles signatures:

public event HandleBooleanValueChange SomethingHappened; 

Et nous passons notre objet EventArgs personnalisés:

bool checked = //get value 
OnSomethingHappened(new BooleanValueChangedEventArgs(checked)); 

Et nous changeons notre gestion des événements dans le parent en conséquence:

void OnInit(EventArgs e) 
{ 
    //attach a handler to the event 
    myChildControl.SomethingHappened += new HandleBooleanValueChange(HandleSomethingHappened); 
} 

//gets called when the control raises its event 
private void HandleSomethingHappened(object sender, BooleanValueChangedEventArgs e) 
{ 
    //set the properties here 
    bool value = e.NewValue; 
} 
+0

Je suis nouveau à C# pouvez-vous donner un bref exemple ou un lien vers un. ;-) –

+0

Merci pour la mise à jour. Cela m'a vraiment aidé à comprendre ce que vous disiez. –

+0

Vous pouvez également simplement utiliser 'EventHandler ' au lieu de créer votre propre type de délégué. Cela le marque également logiquement en tant que délégué de gestionnaire d'événement. –