基本上我想尝试做的是制作一个简单的表单,用户可以输入登录信息(将它们登录到mysql DB中。然后程序将查询数据库,显示信息和用户可以做一些操纵。
我想避免的是拥有一堆弹出窗口表单(一个用于登录,一个用于选择数据库查询等)...
所以我想的是在我的主体中,嵌入了“子形式”。我正在阅读这篇文章,发现大多数人都认为最好将用户控件嵌套到表单中,而不是其他形式。
这样你就可以看到我在说什么,这是我想要它的一个非常基本的骨架:
正如您所看到的,非常简单,只是不是拥有所有弹出框,而是将用户输入内容嵌入到表单的右侧
那么,我是否应该为此使用用户控件?
如果是这样,我在从用户控件中将值返回到主窗体时遇到一些问题(因为没有showDialog()方法或来自用户控件的对话框结果,所以我不知道用户何时输入了所有内容例如,他们登录sql server的数据。)
我试图使用引用调用将值传递给我想要由用户控件设置的usercontrol - 但是我还没有能够完成这项工作......
无论如何,如果我在这里使用userControl而不是userForm,我应该如何将用户输入返回到mainform?
答案 0 :(得分:3)
使用Panel
。
我通常用于将信息传递回主表单的模式是为我的嵌入式内容创建子类,并为我想要传递回主表单的每个事物在这个子类上创建属性。
示例:
public class LoginPanel : Panel
{
public string Username { get; set;}
...
}
如果我想得到想象并做一些事情,比如自动检查主机是否有效或凭据是否会进行身份验证,我可能还会向Changed
添加Panel
事件,只要有更改为其包含的任何输入的内容。然后我会在我的主窗体上为这个事件添加一个处理程序。
如果你想得到真正的想象(如果我打算创建一个可重用的用户控件,我会这样做)你可以在子类中进行所有连接和身份验证,只有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);
}
}
答案 1 :(得分:1)
当您要在整个应用程序的不同位置反复执行相同的操作时,您希望使用自定义用户控件。例如,如果您的应用中有多个位置,用户需要输入登录信息,那么您可能希望创建一个用户控件来封装该功能,这样您只需编程逻辑并查看一次,而不是一遍又一遍再次。应用程序的复杂性增加了,但不必编写冗余代码的价值远远大于
中的次要复杂性。但是,在您只执行一次某个功能的地方,添加用户控件会增加应用程序的复杂性,而不会添加反冗余值,因此应该避免使用。
我会将问题的“操作方法”实施部分留给其他人。