【问题标题】:Should I be using a User Control?我应该使用用户控件吗?
【发布时间】:2011-06-20 19:22:37
【问题描述】:

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

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

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

您可以看到我在说什么,这是我希望它看起来像的一个非常基本的骨架:

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

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

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

我尝试使用引用调用将值传递给我希望由用户控件设置的用户控件 - 但我无法完成这项工作...

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

【问题讨论】:

  • 标题中不必加上“C#”。它已经在标签中了。
  • 好的...下次我会记住的谢谢

标签: c# winforms user-controls


【解决方案1】:

使用Panel

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

例子:

public class LoginPanel : Panel
{
    public string Username { get; set;}
    ...
}

如果我想变得花哨并执行诸如自动检查主机是否有效或凭据将进行身份验证之类的事情,我还可以向Panel 添加一个Changed 事件,该事件在内容发生更改时触发它包含的任何输入。然后我会在我的主窗体上为这个事件添加一个处理程序。

如果你想变得非常花哨(如果我要创建一个可重用的用户控件,我会这样做)你可以在你的子类中完成所有的连接和身份验证,只有一个 SqlConnection 属性并触发一个 @987654327 @事件。

类似这样的:

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);
    }
}

【讨论】:

  • 好的,我会尝试使用面板...这实际上很有意义。我仍然有点模糊的唯一部分是如何将面板中的信息传递回主程序?因为主程序不知道文本框的值何时正确输入...我可以在面板中有一个按钮,但主按钮如何知道何时按下按钮?谢谢!!
  • @Toadums 如果您喜欢这个答案,您应该投票并接受! :-)
  • 我知道如何传回这些值(就像你给出的第一个代码 sn-p 一样),问题是主程序(控制面板)如何知道什么时候有有效值?
  • @Toadums 这就是添加额外事件的地方。您将一个事件添加到您的子类中,该事件随时触发,并在您的主窗体上为其添加一个事件处理程序。或者,如果按钮在您的主窗体上,您可以在按钮事件处理程序触发时检查值。
  • 嗯,我想我更喜欢第一个的想法(有一个触发事件)......我以前从未这样做过,但我会努力让它工作:) 谢谢!
【解决方案2】:

当您要在整个应用程序的不同位置一次又一次地做同样的事情时,您想使用自定义用户控件。例如,如果您的应用程序中有多个位置需要用户输入登录信息,那么您可能希望制作一个用户控件来封装该功能,这样您只需要编写逻辑并查看一次,而不是一遍又一遍再次。应用程序的复杂度增加了,但不必编写冗余代码的价值远大于

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

我会将问题的“操作方法”实施部分留给其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多