C# 正确的用户控制用法?
我刚开始将我的GUI应用程序分解为用户控件。我有一个TabControl和一堆TagePages。显然,我的MainForm.cs文件中充满了大量事件和控件等,很快就变得非常混乱 因此,前面的一个问题让我了解了如何创建UserControl。我打算为每个选项卡页创建一个UserControl,我想知道如何与主窗体上的组件或其他UserControl交互 下面是我使用UserControl创建的TabPage示例,它需要根据当前选择的TabPage启用或禁用按钮。这是正确的用法还是有更好的方法C# 正确的用户控制用法?,c#,winforms,user-controls,C#,Winforms,User Controls,我刚开始将我的GUI应用程序分解为用户控件。我有一个TabControl和一堆TagePages。显然,我的MainForm.cs文件中充满了大量事件和控件等,很快就变得非常混乱 因此,前面的一个问题让我了解了如何创建UserControl。我打算为每个选项卡页创建一个UserControl,我想知道如何与主窗体上的组件或其他UserControl交互 下面是我使用UserControl创建的TabPage示例,它需要根据当前选择的TabPage启用或禁用按钮。这是正确的用法还是有更好的方法 p
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 这里的问题是:
要考虑的另一件事是:向用户控件添加的功能越多,它的可重用性就越差,或者代码就越复杂。例如,如果您在用户控件中添加验证,您将发现有一天您需要它而不需要验证,因此您将添加一个属性“bool ValidateData”,否则它将非常复杂,您将需要构建另一个控件。解决这一问题的一种方法是构建非常小的用户控件,但将它们组合到一个或多个更大的用户控件中,以满足您当前的所有需求。这看起来不是一个很好的用户控件使用方法。当用户控件中的某些内容发生更改时,用户控件不应决定窗体中的内容的行为。用户控件应该不知道它的容器,并且应该在任何容器中操作 用户控件应该通知表单某些内容已更改,而不告诉内部实现是什么,表单应该决定执行什么操作 例如: 名为“NameUserControl”的用户控件由TitleComboBox、FirstNameTextBox和LastNameTextBox组成。用户控件希望在其中一个值发生更改时发出通知 错误方式: 创建事件: TitleComboBox-已选择索引已更改。 FirstNameTextBox,LastNameTextBox-TextChanged 这里的问题是:
要考虑的另一件事是:向用户控件添加的功能越多,它的可重用性就越差,或者代码就越复杂。例如,如果您在用户控件中添加验证,您将发现有一天您需要它而不需要验证,因此您将添加一个属性“bool ValidateData”,否则它将非常复杂,您将需要构建另一个控件。解决这一问题的一种方法是构建非常小的用户控件,但将它们组合到一个或多个更大的用户控件中,以满足您当前的所有需求。这里显然使用了一个事件,这使得您的评论更加无用。尝试更具描述性或提供更多关于您的意思的详细信息。您的页面可以了解有关用户控件的详细信息。但是,您的用户控件不必关心页面上包含它的任何内容。否则,您将得到只能在一种类型的页面上使用的用户控件。@user1402923-如果对于这个项目来说,用户控件只能在这一种类型的页面上使用是可以接受的呢?@Tada-您真的不想陷入“我可以做出糟糕的设计决策,因为这在这个项目中无关紧要”的心态。你想做的是尽可能地编写出最通用、最有用的代码。此外,你永远不知道将来是否还会做类似的事情!很明显,这里使用了一个事件,这使得你的评论更加没有帮助。尝试更具描述性或提供更多关于您的意思的详细信息。您的页面可以了解有关用户控件的详细信息。但是,您的用户控件不必关心页面上包含它的任何内容。否则,您将得到只能在一种类型的页面上使用的用户控件。@user1402923-如果