2010-03-05 12 views
5

Ich habe drei Benutzersteuerelemente. Hier sind die Beschreibungen von ihnen: 1) Erste Benutzerkontrolle (ucCountry) enthält Combobox, die Ländernamen aus einer XML-Datei zeigt.Windows Forms-Anwendung, wie kommuniziert man zwischen benutzerdefinierten Steuerelementen?

2) Zweites Benutzersteuerelement (ucChannelType) enthält zwei Optionsfelder, von denen eines "TV" und das andere "Radio Channel Type" auswählen kann.

3) Dritter Usercontrol (ucChannels) wird alle Kanäle füllen, wo Ländernamen von ucCountry vorgesehen ist und durch ucChannelType

nun vorgesehen Typen, wie zwischen dieser Benutzersteuerung in einer Form zu kommunizieren. Ich muss die usercontrols vom Formular entkoppeln. Also, ich muss Ereignisse verwenden. Aber wenn ucCountry ein Ereignis auslöst (z. B. CountryChanged-Ereignis) und ucChannels das Ereignis subskribiert, wie erhält man den Kanaltyp von ucChannelType.

Vielen Dank im Voraus ...

Antwort

3

beste Lösung ist, Objekte zu Ihrem benutzerdefinierten Steuerelemente hinzuzufügen. Da im Hintergrund möglicherweise keine Felder vorhanden sind, erhalten die Getter nur Daten aus der Eigenschaft der internen Standardsteuerung.

+0

+1 Dies ist die empfohlene Lösung von Microsoft. –

+0

Ich höre nicht damit auf, nehme an, dass 'control_A' einen Button hat, wie könnte' control_B' wissen, dass der Button angeklickt wird, sobald er auf 'control_A' geklickt hat? – ThunderWiring

+0

@ThunderWiring dies ist eine dumme Antwort (ich gestehe, ich schrieb es) es beantwortet nicht wirklich die Frage, adharris Antwort ist die richtige Antwort. – Andrey

2

Sie könnten entweder eine Eigenschaft auf ucCountry haben, die das aktuell ausgewählte Land zur Verfügung stellt. Etwas wie:

public Country SelectedCountry 
{ 
    get 
    { 
     return (Country) myComboBox.SelectedItem; 
    } 
} 

Und dann, wenn das Ereignis ausgelöst wird, die anderen steuert einen die Eigenschaft erhalten gehen.

Die andere Option ist eine benutzerdefinierte Ereignisdelegaten zu verwenden, so dass der Ereignishandler für ucCountry.CountryChanged ein Land Parameter haben würde:

public delegate void CountryChangedDelegate(Country sender) 

public event CountryChangedDelegate CountryChanged; 

Ereignishandler in ucChannels:

public void ucCountry_CountryChanged(Country sender) 
{ 
    //do something with the new country 
} 

Und Draht das Ereignis zu ucChannels:

myUcCountry.CountryChanged += new CountryChangedDelegate(ucCountry_CountryChanged); 
0

Sie müssen öffentliche Eigenschaften haben s für die Steuerelemente, die Daten liefern, und eine öffentliche Methode zum Registrieren von Ereignissen für die Steuerung, die die Daten verbraucht. Hier ein kleines Beispiel:

public static void Test() 
{ 
    var a = new A(); 
    var b = new B(); 
    var c = new C() {a = a, b = b}; 
    a.OnChange += c.Changed; 
    b.OnChange += c.Changed; 
    a.State = "CA"; 
    b.ChannelType = "TV"; 
} 

class A 
{ 
    private string _state; 

    public string State 
    { 
     get { return _state; } 
     set 
     { 
      _state = value; 
      if (OnChange != null) OnChange(this, EventArgs.Empty); 
     } 
    } 

    public event EventHandler<EventArgs> OnChange; 
} 

class B 
{ 
    private string _channelType; 

    public string ChannelType 
    { 
     get { return _channelType; } 
     set 
     { 
      _channelType = value; 
      if (OnChange != null) OnChange(this, EventArgs.Empty); 
     } 
    } 

    public event EventHandler<EventArgs> OnChange; 
} 

class C 
{ 
    public A a { get; set; } 
    public B b { get; set; } 
    public void Changed(object sender, EventArgs e) 
    { 
     Console.WriteLine("State: {0}\tChannelType: {1}", a.State, b.ChannelType); 
    } 
} 
Verwandte Themen