Приложение Windows Forms, как связаться между пользовательскими элементами управления?

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

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

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

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

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

5
задан John Saunders 5 March 2010 в 18:45
поделиться

3 ответа

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

3
ответ дан 14 December 2019 в 19:10
поделиться

Вы можете либо иметь свойство на 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);
2
ответ дан 14 December 2019 в 19:10
поделиться

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

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);
    }
}
0
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: