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;
}
Je suis nouveau à C# pouvez-vous donner un bref exemple ou un lien vers un. ;-) –
Merci pour la mise à jour. Cela m'a vraiment aidé à comprendre ce que vous disiez. –
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. –