Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确的用户控制用法?_C#_Winforms_User Controls - Fatal编程技术网

C# 正确的用户控制用法?

C# 正确的用户控制用法?,c#,winforms,user-controls,C#,Winforms,User Controls,我刚开始将我的GUI应用程序分解为用户控件。我有一个TabControl和一堆TagePages。显然,我的MainForm.cs文件中充满了大量事件和控件等,很快就变得非常混乱 因此,前面的一个问题让我了解了如何创建UserControl。我打算为每个选项卡页创建一个UserControl,我想知道如何与主窗体上的组件或其他UserControl交互 下面是我使用UserControl创建的TabPage示例,它需要根据当前选择的TabPage启用或禁用按钮。这是正确的用法还是有更好的方法 p

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

因此,前面的一个问题让我了解了如何创建UserControl。我打算为每个选项卡页创建一个UserControl,我想知道如何与主窗体上的组件或其他UserControl交互

下面是我使用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);

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

用户控件应该通知表单某些内容已更改,而不告诉内部实现是什么,表单应该决定执行什么操作

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

错误方式:

创建事件:

TitleComboBox-已选择索引已更改。 FirstNameTextBox,LastNameTextBox-TextChanged

这里的问题是:

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

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

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


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

    这看起来不是一个很好的用户控件使用方法。当用户控件中的某些内容发生更改时,用户控件不应决定窗体中的内容的行为。用户控件应该不知道它的容器,并且应该在任何容器中操作

    用户控件应该通知表单某些内容已更改,而不告诉内部实现是什么,表单应该决定执行什么操作

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

    错误方式:

    创建事件:

    TitleComboBox-已选择索引已更改。 FirstNameTextBox,LastNameTextBox-TextChanged

    这里的问题是:

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

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

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


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

    这里显然使用了一个事件,这使得您的评论更加无用。尝试更具描述性或提供更多关于您的意思的详细信息。您的页面可以了解有关用户控件的详细信息。但是,您的用户控件不必关心页面上包含它的任何内容。否则,您将得到只能在一种类型的页面上使用的用户控件。@user1402923-如果对于这个项目来说,用户控件只能在这一种类型的页面上使用是可以接受的呢?@Tada-您真的不想陷入“我可以做出糟糕的设计决策,因为这在这个项目中无关紧要”的心态。你想做的是尽可能地编写出最通用、最有用的代码。此外,你永远不知道将来是否还会做类似的事情!很明显,这里使用了一个事件,这使得你的评论更加没有帮助。尝试更具描述性或提供更多关于您的意思的详细信息。您的页面可以了解有关用户控件的详细信息。但是,您的用户控件不必关心页面上包含它的任何内容。否则,您将得到只能在一种类型的页面上使用的用户控件。@user1402923-如果