2010-03-05 29 views
5

Tengo tres controles de usuario. Aquí está la descripción de ellos: 1) El primer control de usuario (ucCountry) contiene un cuadro combinado que muestra los nombres de países de un archivo xml.aplicación Windows Forms, cómo comunicarse entre controles personalizados?

2) El segundo control de usuario (ucChannelType) contiene dos botones de opción para seleccionar el televisor y otros para seleccionar el tipo de canal de radio.

3) Tercer usercontrol (ucChannels) rellenará todos los canales en los que el nombre del país es proporcionado por ucCountry y tipo proporcionado por ucChannelType

Ahora, la manera de comunicarse entre estos control de usuario en un formulario. Necesito desacoplar los controles de usuario del formulario. Entonces, necesito usar eventos. Pero si ucCountry activa un evento (digamos evento CountryChanged) y ucChannels suscriben el evento, cómo obtener el tipo de canal de ucChannelType.

Gracias de antemano ...

Respuesta

3

mejor solución es añadir la propiedad a sus controles personalizados. puede que no haya campos en el fondo, los getters solo obtendrán datos de la propiedad del control estándar interno.

+0

+1 Esta es la solución recomendada por Microsoft. –

+0

No dejo de obtenerlo, supongo que 'control_A' tiene un botón, ¿cómo podría' control_B' saber que se hace clic en el botón en el mismo momento en que se hace clic en 'control_A'? – ThunderWiring

+0

@ThunderWiring esta es una respuesta estúpida (confieso que lo escribí) realmente no responde la pregunta, la respuesta de adharris es la respuesta correcta. – Andrey

2

Puede tener una propiedad en ucCountry que proporciona el país seleccionado actualmente. Algo así como:

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

Y luego, cuando el evento se dispara, los otros controles van a obtener la propiedad.

La otra opción es utilizar un delegado de eventos personalizado, por lo que el controlador de eventos para ucCountry.CountryChanged tendría un parámetro país:

public delegate void CountryChangedDelegate(Country sender) 

public event CountryChangedDelegate CountryChanged; 

Controlador de eventos en ucChannels:

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

y el alambre del evento a ucChannels:

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

Necesita tener propiedad pública s para los controles que suministran datos, y un método público para registrar eventos para el control que consume los datos. Aquí hay un ejemplo rápido:

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); 
    } 
} 
Cuestiones relacionadas