2010-03-05 3 views
5

J'ai trois commandes utilisateur. Voici la description d'entre eux: 1) Le premier contrôle utilisateur (ucCountry) contient une liste déroulante qui affiche les noms de pays à partir d'un fichier xml.Application Windows Forms, comment communiquer entre des contrôles personnalisés?

2) Le deuxième contrôle utilisateur (ucChannelType) contient deux boutons radio, un pour sélectionner TV et l'autre pour sélectionner le type de canal radio.

3) Troisième usercontrol (ucChannels) remplira tous les canaux où le nom du pays est fourni par ucCountry et type prévu par ucChannelType

Maintenant, comment communiquer entre ces contrôle utilisateur sous une forme. Je dois découpler les commandes userc du formulaire. Donc, j'ai besoin d'utiliser des événements. Mais si ucCountry déclenche un événement (par exemple un événement CountryChanged) et que ucChannels souscrit l'événement, comment obtenir le type de canal à partir de ucChannelType.

Merci à l'avance ...

Répondre

3
meilleure solution

est d'ajouter des propriétés à vos contrôles personnalisés. il peut n'y avoir aucun champ en arrière-plan, les getters obtiendront juste des données de la propriété du contrôle standard interne.

+0

+1 Ceci est la solution recommandée par Microsoft. –

+0

Je n'arrête pas de l'obtenir, supposons que 'control_A' ait un bouton, comment' control_B' pourrait-il savoir que le bouton est cliqué le même moment où il est cliqué sur 'control_A'? – ThunderWiring

+0

@ThunderWiring c'est une réponse stupide (je l'avoue je l'ai écrit) il ne répond pas vraiment à la question, la réponse d'adharris est la bonne réponse. – Andrey

2

Vous pouvez avoir une propriété sur ucCountry qui fournit le pays actuellement sélectionné. Quelque chose comme:

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

Et puis, quand l'événement se déclenche, les autres contrôles vont obtenir un bien.

L'autre option est d'utiliser un délégué d'événement personnalisé, de sorte que le gestionnaire d'événements pour ucCountry.CountryChanged aurait un paramètre de pays:

public delegate void CountryChangedDelegate(Country sender) 

public event CountryChangedDelegate CountryChanged; 

Gestionnaire d'événements dans ucChannels:

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

et fil de l'événement à ucChannels:

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

Vous devez avoir une propriété publique s pour les contrôles fournissant des données, et une méthode publique pour enregistrer les événements pour le contrôle consommant les données. Voici un exemple rapide:

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); 
    } 
} 
Questions connexes