C# 我应该使用用户控件吗?

C# 我应该使用用户控件吗?,c#,winforms,user-controls,C#,Winforms,User Controls,所以基本上我想尝试做的是,制作一个简单的表单,用户可以输入登录信息(将它们登录到mysql数据库中),然后程序将查询数据库,显示信息,用户可以进行一些操作 我想要避免的是有一堆弹出窗口表单(一个用于登录,一个用于选择数据库查询,等等) 所以我的想法是在我的主窗体中嵌入“子窗体”。我阅读了有关这方面的内容,发现大多数人都说将用户控件嵌套到窗体中比其他窗体更好 为了让你明白我在说什么,这是我想要它看起来的一个非常基本的框架: 如您所见,非常简单,只是将用户输入的内容嵌入表单的右侧,而不是所有的弹出

所以基本上我想尝试做的是,制作一个简单的表单,用户可以输入登录信息(将它们登录到mysql数据库中),然后程序将查询数据库,显示信息,用户可以进行一些操作

我想要避免的是有一堆弹出窗口表单(一个用于登录,一个用于选择数据库查询,等等)

所以我的想法是在我的主窗体中嵌入“子窗体”。我阅读了有关这方面的内容,发现大多数人都说将用户控件嵌套到窗体中比其他窗体更好

为了让你明白我在说什么,这是我想要它看起来的一个非常基本的框架:

如您所见,非常简单,只是将用户输入的内容嵌入表单的右侧,而不是所有的弹出框

那么,我真的应该为此使用用户控件吗

如果是这样,我在从用户控件将值返回主窗体时遇到了一些问题(例如,因为用户控件没有showDialog()方法或对话框结果,所以我不知道用户何时输入了sql server的所有登录数据)

我曾尝试使用callby reference将值传递给usercontrol,我希望由用户控件设置该值-但我一直无法使其正常工作


无论如何,如果我应该在这里使用userControl而不是userForm,我应该如何将用户输入返回到主窗体???

当你在整个应用程序中的不同位置重复执行相同的操作时,你想使用自定义用户控件。例如,如果你的应用程序中有多个位置er需要输入登录信息,然后您需要创建一个用户控件来封装该功能,这样您只需对逻辑进行编程并查看一次,而不是反复查看。应用程序的复杂性增加了,但不必编写冗余代码的价值远远大于

但是,在您只执行一次特定功能的地方,添加用户控件会在不添加反冗余值的情况下增加应用程序的复杂性,因此应该避免


我会留下“操作指南”将问题的实现部分提交给其他人。

当您要在整个应用程序的不同位置反复执行相同的操作时,您希望使用自定义用户控件。例如,如果您的应用程序中有多个位置需要用户输入登录信息,则您希望将用户控件设置为trol封装该功能,这样您只需编写逻辑并查看一次,而不是反复查看。应用程序的复杂性增加了,但不必编写冗余代码的价值远远大于

但是,在您只执行一次特定功能的地方,添加用户控件会在不添加反冗余值的情况下增加应用程序的复杂性,因此应该避免

我将把问题的“如何”实现部分留给其他人。

使用

我通常用于将信息传回主窗体的模式是为我的嵌入内容创建子类面板,并为我要传回主窗体的每个内容在子类上创建属性

例如:

public class LoginPanel : Panel
{
    public string Username { get; set;}
    ...
}
如果我想做一些有趣的事情,比如自动检查主机是否有效或者凭据是否将进行身份验证,我还可以向
面板添加
Changed
事件,每当它包含的任何输入的内容发生更改时,就会触发该事件。然后,我会在主窗体上为该事件添加一个处理程序

如果您想变得非常有趣(如果我要创建一个可重用的用户控件,我会这样做),您可以在子类中执行所有连接和身份验证,只使用
SqlConnection
属性并触发
Connected
事件

大概是这样的:

public class LoginPanel : Panel
{
    // A property returning a valid connection when
    // connected, null otherwise.
    public SqlConnection connection { get; set;}
    ...

    // An event that clients can use to be notified whenever 
    // a connection is made.
    public event EventHandler Connected;

    // Invoke the Connected event; called whenever a successful 
    // connection is made
    protected virtual void OnConnected(EventArgs e) 
    {
       if (Connected!= null)
          Connected(this, e);
    }
}
使用一个

我通常用于将信息传回主窗体的模式是为我的嵌入内容创建子类面板,并为我要传回主窗体的每个内容在子类上创建属性

例如:

public class LoginPanel : Panel
{
    public string Username { get; set;}
    ...
}
如果我想做一些有趣的事情,比如自动检查主机是否有效或者凭据是否将进行身份验证,我还可以向
面板添加
Changed
事件,每当它包含的任何输入的内容发生更改时,就会触发该事件。然后,我会在主窗体上为该事件添加一个处理程序

如果您想变得非常有趣(如果我要创建一个可重用的用户控件,我会这样做),您可以在子类中执行所有连接和身份验证,只使用
SqlConnection
属性并触发
Connected
事件

大概是这样的:

public class LoginPanel : Panel
{
    // A property returning a valid connection when
    // connected, null otherwise.
    public SqlConnection connection { get; set;}
    ...

    // An event that clients can use to be notified whenever 
    // a connection is made.
    public event EventHandler Connected;

    // Invoke the Connected event; called whenever a successful 
    // connection is made
    protected virtual void OnConnected(EventArgs e) 
    {
       if (Connected!= null)
          Connected(this, e);
    }
}

没有必要在标题中加上“C”。它已经在标签中了。好吧……下次我会记得的。没有必要加上“C”在标题中。它已经在标签中。好的……我会记得下次谢谢,我会尝试使用一个面板……这实际上很有意义。我唯一还不清楚的部分是如何将面板中的信息传递回主程序?因为主程序不知道何时输入文本框的值显然…我可以在面板中有一个按钮,但是主按钮如何知道按钮何时被按下?谢谢!!@Toadams如果你喜欢这个答案,你应该向上投票并接受!:-)我知道如何传回值(就像你给出的第一个代码片段),问题是主程序(保存面板)如何运行知道什么时候有有效值吗?@toadams这就是添加额外事件的地方。您向子类添加了一个事件,每当您