正确的UserControl用法?

时间:2012-09-05 14:45:36

标签: c# winforms user-controls

我刚刚开始将我的GUI应用程序分解为UserControls。我有一个带有一堆TagePages的TabControl。显然我的MainForm.cs文件充满了大量的事件和控件等,而且它很快就变得非常混乱。

因此,之前的一个问题让我了解了如何创建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);

1 个答案:

答案 0 :(得分:3)

这看起来不像用户控件的好用。当用户控件中的某些内容发生更改时,用户控件不应决定表单中的内容应如何表现。用户控件应该不知道其容器,并且应该在任何容器中运行。

用户控件应该通知表单某些内容已经发生变化而不告知内部实现是什么,表单应该决定该怎么做。

实施例: 名为“NameUserControl”的用户控件由TitleComboBox,FirstNameTextBox和LastNameTextBox组成。用户控件想要在其中一个值发生更改时通知。

错误方式:

创建活动:

TitleComboBox - SelectedIndexChanged。 FirstNameTextBox,LastNameTextBox - TextChanged。

这里的问题:

  1. 您公开了内部控件的行为。如果要将TitleComboBox更改为TextBox,会发生什么?您必须更改事件名称和实施。
  2. 您揭露了使用3个不同控件的事实。如果您想使用相同的文本框作为名和姓,会发生什么?您必须删除一个事件并更改另一个事件的名称。
  3. 好方法:

    仅创建一个事件: NameChanged 并公开FullName的1个属性或值的三个不同属性。

    表单订阅该事件并决定下一步该做什么。

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