Windows Forms应用程序,如何在自定义控件之间进行通信?

时间:2010-03-05 18:34:09

标签: c# .net winforms user-controls

我有三个用户控件。以下是对它们的描述: 1)第一个用户控件(ucCountry)包含组合框,它显示xml文件中的国家/地区名称。

2)第二个用户控制(ucChannelType)包含两个单选按钮,一个用于选择电视,另一个用于选择无线电频道类型。

3)第三个usercontrol(ucChannels)将填充ucCountry提供国家名称的所有频道,以及ucChannelType提供的类型

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

提前致谢...

3 个答案:

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