2010-03-05 32 views
5

我有三个用户控件。这里是他们的描述: 1)第一个用户控件(ucCountry)包含组合框,它显示来自xml文件的国家名称。Windows窗体应用程序,如何在自定义控件之间进行通信?

2)第二个用户控件(ucChannelType)包含两个单选按钮,一个用于选择TV,另一个用于选择Radio Channel Type。

3)第三用户控件(ucChannels)将填充其中的国家名称是由ucCountry提供和类型由ucChannelType

提供现在,如何在这些形式的用户控制之间进行通信的所有信道。我需要从表单中分离usercontrols。所以,我需要使用事件。但是,如果ucCountry触发一个事件(比如说CountryChanged事件)并且ucChannels订阅该事件,那么如何从ucChannelType获取通道类型。

在此先感谢...

回答

3

最好的解决方案是将属性添加到您的自定义控件。在后台可能没有字段,获取者只会从内部标准控制的属性中获取数据。

+0

+1这是微软推荐的解决方案。 – 2010-03-05 18:49:22

+0

我没有退出得到它,假设'control_A'有一个按钮,'control_B'怎么知道点击'control_A'上的按钮被点击的时刻? – ThunderWiring 2016-10-12 13:54:39

+0

@ThunderWiring这是愚蠢的答案(我承认我写了它)它并没有真正回答这个问题,adharris的答案是正确的答案。 – Andrey 2016-10-12 14:01:35

2

您可以在ucCountry上提供当前选定国家/地区的房产。例如:

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

然后,当事件触发时,其他控件将获取属性。

另一种选择是使用自定义事件委托,所以ucCountry.CountryChanged事件处理程序将有一个国家的参数:

public delegate void CountryChangedDelegate(Country sender) 

public event CountryChangedDelegate CountryChanged; 

事件处理程序ucChannels:

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

和线材事件到ucChannels:

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

您需要具有公共属性s提供数据的控件,以及一个公共方法来注册事件以用于控制消费数据。这里有一个简单的例子:

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