Приложение Windows Forms, как общаться между пользовательскими элементами управления? - PullRequest
5 голосов
/ 05 марта 2010

У меня есть три пользовательских элемента управления. Вот их описание: 1) Первый пользовательский элемент управления (ucCountry) содержит поле со списком, в котором отображаются названия стран из XML-файла.

2) Второй пользовательский элемент управления (ucChannelType) содержит две радиокнопки: одну для выбора телевизора, а другую для выбора типа радиоканала.

3) Третий пользовательский контроль (ucChannels) заполняет все каналы, где название страны предоставляется ucCountry, а тип - ucChannelType

Теперь, как общаться между этими пользовательскими элементами управления в форме. Мне нужно отделить пользовательские элементы управления от формы. Итак, мне нужно использовать события. Но если ucCountry запускает событие (скажем, событие CountryChanged) и ucChannels подписывает событие, как получить тип канала из ucChannelType.

Заранее спасибо ...

Ответы [ 3 ]

3 голосов
/ 05 марта 2010

Лучшее решение - добавить свойства в ваши пользовательские элементы управления.в фоновом режиме могут отсутствовать поля, получатели просто получат данные из свойства внутреннего стандартного элемента управления.

2 голосов
/ 05 марта 2010

У вас может быть свойство 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 голосов
/ 05 марта 2010

Вам необходимо иметь открытые свойства для элементов управления, предоставляющих данные, и открытый метод регистрации событий для элемента управления, потребляющего данные. Вот быстрый пример:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...