0

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

所以之前的问题让我了解了如何创建用户控件。我打算为每个 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);
4

1 回答 1

3

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

用户控件应该通知表单发生了一些变化,而不告诉表单内部实现是什么,并且表单应该决定做什么。

示例:名为“NameUserControl”的用户控件由 TitleComboBox、FirstNameTextBox 和 LastNameTextBox 组成。用户控件希望在其中一个值发生更改时发出通知。

错误道:

创建事件:

TitleComboBox - SelectedIndexChanged。FirstNameTextBox、LastNameTextBox - TextChanged。

这里的问题:

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

好办法:

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

无论哪种方式,表单都会订阅事件并决定下一步做什么。

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

于 2012-09-05T14:57:44.747 回答