2012-09-05 27 views
0

我刚开始把我的GUI应用程序分解成UserControls。我有一堆TagePages的TabControl。显然,我的MainForm.cs文件中充满了大量的事件和控件等,它很快就变得非常混乱。正确的UserControl用法?

因此,前面的问题让我深入了解如何创建UserControl。我打算为每个TabPage创建一个UserControl,我想知道如何与主窗体或其他UserControls上的组件进行交互。

这是我使用UserControl制作的TabPage的一个示例,需要启用或禁用取决于当前选择哪个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和揭露全名的房产或为价值观三个不同的特性。

无论哪种方式,表单订阅事件并决定接下来要做什么。

另一件需要考虑的事情是:您越多地为用户控件添加更多功能,您可能会使其重复使用次数减少,或者使代码更加复杂。例如,如果您在用户控件中添加验证,您会发现有一天您不需要验证就需要它,所以您将添加一个属性“bool ValidateData”,否则它将非常复杂,您需要构建另一个控制。解决这个问题的一种方法是构建非常小的用户控件,但将它们组合到一个或多个更大的用户控件中,以满足您当前的所有需求。

+0

当你说“用户控件应该通知表单有什么改变而不告诉内部实现是什么,表单应该决定该怎么做”。你能给我举个例子吗?就像表单订阅UserControl中的一个事件一样? – Tada

+1

添加例子 –

+0

感谢Amiram这个例子,我认为这对我来说是非常好的角度。 – Tada