Es ist nicht angemessen, Eigenschaften in einer übergeordneten Form überhaupt zu ändern. Stattdessen sollte Ihr untergeordnetes Formular ein Ereignis auslösen, auf das das übergeordnete Formular wartet, und ändert seinen eigenen Wert entsprechend.
Wenn Sie das übergeordnete Formular vom untergeordneten Objekt manipulieren, wird eine wechselseitige Kopplung erstellt. Das übergeordnete Formular besitzt das untergeordnete Element, das untergeordnete Element verfügt jedoch über detaillierte Kenntnisse und Abhängigkeiten vom übergeordneten Formular. Sprudeln ist die etablierte Lösung dafür, da die Informationen nach oben fließen können ("blubbern") und dabei keine strikte Kopplung erforderlich ist.
Hier ist das grundlegendste Beispiel für Vielseitigkeit. Es beinhaltet nicht die Weitergabe bestimmter Informationen in der Veranstaltung (was Sie benötigen), sondern deckt das Konzept ab.
In Ihrem Kind Form:
//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);
}
Und in Ihrer Mutterform:
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
}
Wie ich oben gesagt, Sie wahrscheinlich einige spezifische Informationen in Ihrer Veranstaltung übergeben müssen. Es gibt ein paar Möglichkeiten, wie wir das machen können, aber am einfachsten ist es, Ihre eigene EventArgs-Klasse und Ihren eigenen Delegaten zu erstellen. Es sieht aus wie Sie angeben müssen, ob einige Wert auf true oder false gesetzt ist, also lassen Sie uns verwenden, dass:
public class BooleanValueChangedEventArgs : EventArgs
{
public bool NewValue;
public BooleanValueChangedEventArgs(bool value)
: base()
{
this.NewValue = value;
}
}
public delegate void HandleBooleanValueChange(object sender, BooleanValueChangedEventArgs e);
Wir haben unsere Veranstaltung ändern können diese neuen Signaturen zu verwenden:
public event HandleBooleanValueChange SomethingHappened;
Und wir übergeben unsere eigene EventArgs-Objekt:
bool checked = //get value
OnSomethingHappened(new BooleanValueChangedEventArgs(checked));
Und wir unsere Veranstaltung entsprechend ändern in der übergeordneten Handling:
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;
}
Ich bin neu in C# können Sie ein kurzes Beispiel oder einen Link zu einem geben. ;-) –
Danke für das Update. Es hat mir wirklich geholfen zu verstehen, was du gesagt hast. –
Sie können auch 'EventHandler' verwenden, anstatt Ihren eigenen Delegattyp zu erstellen. Dies markiert es auch logisch als Event-Handler-Delegat. –