2012-09-05 5 views
0

Я только начал разбивать свое приложение GUI на UserControls. У меня есть TabControl с кучей TagePages. Очевидно, что файл MainForm.cs был заполнен множеством событий и элементов управления и т. Д., И это стало очень грязным.Правильное использование UserControl?

Итак, предыдущий вопрос дал мне представление о том, как создать UserControl. Я намерен создать UserControl для каждой TabPage, и мне было интересно, как я могу взаимодействовать с компонентами в основной форме или других UserControls.

Вот пример TabPage, который я создал с помощью UserControl, которому необходимо включить или отключить кнопку, в зависимости от выбранной вкладки TabPage. Это правильное использование или есть лучший способ?

public partial class TabDetails : UserControl 
{ 
    private RequestForm fRequestForm; 
    public TabDetails() 
    { 
     InitializeComponent(); 
    } 

    public void CustomInitialization(RequestForm pRequestForm) 
    { 
     fRequestForm = pRequestForm; 
     pRequestForm.TabControl_Main.SelectedIndexChanged += SelectedTabIndexChanged; 
    } 

    private void SelectedTabIndexChanged(object pSender, EventArgs pEvents) 
    { 
     fRequestForm.Button_SubmitRequest.Enabled = fRequestForm.TabControl_Main.SelectedTab != fRequestForm.Tab_Details; 
    } 
} 

В конструкторе MainForm.cs я называю:

this.tab_Details1.CustomInitialization(this); 
+0

Нет. Используйте мероприятие. –

+0

Очевидно, что здесь используется Событие, что делает ваш комментарий еще более бесполезным. Попытайтесь немного описать или предоставить более подробную информацию о том, что вы имеете в виду. – Tada

+1

Это хорошо, потому что ваша страница знает специфику вашего пользовательского контроля. Однако ваш пользовательский элемент управления не должен заботиться о чем-либо на странице, содержащей его. В противном случае вы получите пользовательские элементы управления, которые вы можете использовать только на одном типе страницы. – RobH

ответ

3

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

Пользовательский элемент управления должен уведомить форму, которую что-то изменил, не указав, что такое внутренняя реализация, и форма должна решить, что делать.

Пример: Пользовательский элемент управления, называемый «NameUserControl», состоит из TitleComboBox, FirstNameTextBox и LastNameTextBox. Пользовательский элемент управления хочет сообщить, когда одно из значений изменилось.

Неправильный путь:

Создание событий:

TitleComboBox - SelectedIndexChanged. FirstNameTextBox, LastNameTextBox - TextChanged.

Проблемы здесь:

  1. Вы обнажить внутреннее поведение элементов управления. Что произойдет, если вы хотите изменить TitleComboBox на TextBox? Вам нужно будет изменить имя и реализацию события.
  2. Вы раскрываете тот факт, что используете ровно 3 разных элемента управления. Что произойдет, если вы хотите использовать одно и то же текстовое поле для имени и фамилии? Вам нужно будет удалить одно событие и изменить имя другого.

хороший способ:

Создать только одно событие: NameChanged и разоблачить 1 свойство FullName или три свойства для значений.

В любом случае форма подписаться на мероприятие и решить, что делать дальше.

Еще одна вещь, о которой стоит подумать: чем больше вы добавляете больше функциональности в свой пользовательский элемент управления, тем меньше вероятность повторного использования или вы делаете его код более сложным. Например, если вы добавите проверку внутри пользовательского элемента управления, вы найдете один день, в котором вы нуждаетесь, без проверки, поэтому вы добавите свойство «bool ValidateData» или это будет настолько сложно, что вам нужно будет создать еще один контроль.Один из способов решить это - создать очень маленькие пользовательские элементы управления, но объединить их в один или несколько более крупных пользовательских элементов управления, которые соответствуют всем вашим текущим потребностям.

+0

Когда вы говорите: «Пользовательский элемент управления должен уведомить форму, которую что-то изменило, не указав, что такое внутренняя реализация, и форма должна решить, что делать». Можете ли вы привести мне пример этого? Как и форма подписки на событие в UserControl? – Tada

+1

Пример добавлен .. –

+0

Спасибо за пример Amiram. Думаю, это положило на меня очень хорошую перспективу. – Tada

Смежные вопросы