2009-08-15 2 views
4

Ich habe mich nur gefragt, ob ich das richtig mache. Ich habe 2 Formulare ein Eltern-Formular und ein Kind-Formular (Optionen-Dialog). eine Eigenschaft in meiner Eltern Form von meinem Kind Form zu ändern, die ich Code verwenden:Was ist die richtige Methode zum Ändern von Eigenschaften in einem übergeordneten Formular von einem untergeordneten Formular?

// 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; 
} 

ich ein RichTextBox nur auf meiner Form haben. Es scheint albern zu sein, ein Array von 1 Kontrolle durchlaufen zu müssen. Ist das der richtige Weg oder ist es einfacher?

Antwort

9

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; 
} 
+0

Ich bin neu in C# können Sie ein kurzes Beispiel oder einen Link zu einem geben. ;-) –

+0

Danke für das Update. Es hat mir wirklich geholfen zu verstehen, was du gesagt hast. –

+0

Sie können auch 'EventHandler ' verwenden, anstatt Ihren eigenen Delegattyp zu erstellen. Dies markiert es auch logisch als Event-Handler-Delegat. –

Verwandte Themen