我有三个用户控件。以下是对它们的描述: 1)第一个用户控件(ucCountry)包含组合框,它显示xml文件中的国家/地区名称。
2)第二个用户控制(ucChannelType)包含两个单选按钮,一个用于选择电视,另一个用于选择无线电频道类型。
3)第三个usercontrol(ucChannels)将填充ucCountry提供国家名称的所有频道,以及ucChannelType提供的类型
现在,如何在表单中的这些用户控件之间进行通信。我需要将用户控件与表单分离。所以,我需要使用事件。但是如果ucCountry触发事件(比如CountryChanged事件)并且ucChannels订阅事件,那么如何从ucChannelType获取通道类型。
提前致谢...
答案 0 :(得分:3)
最佳解决方案是向自定义控件添加属性。在后台可能没有字段,getter只会从内部标准控件的属性中获取数据。
答案 1 :(得分:2)
您可以在ucCountry
上拥有提供当前所选国家/地区的属性。类似的东西:
public Country SelectedCountry
{
get
{
return (Country) myComboBox.SelectedItem;
}
}
然后当事件触发时,其他控件将获取属性。
另一个选项是使用自定义事件委托,因此ucCountry.CountryChanged
的事件处理程序将具有country参数:
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);
答案 2 :(得分:0)
您需要为提供数据的控件提供公共属性,并为需要使用数据的控件注册事件的公共方法。这是一个简单的例子:
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);
}
}