我的 form1(Design) 里面有一个按钮,但是在我的 form1(Class) 中它变得非常拥挤,所以我想创建一个新类。但是如何使按钮在新类中工作(新类名称是 form2(Class)。当然该功能适用于 form1(Class) 中的按钮,那么我如何使它从 form2(Class) 中工作?
5 回答
UserControl
使用自己的Controls
逻辑创建自己的自定义。或者partial class
为您创建From1
并将事件逻辑放在那里。
值得考虑将您的 UI 代码(例如按钮事件处理)与应用程序的核心逻辑分开。
有很多方法可以做到这一点,但通常从一个模型类开始,它代表你的窗口正在操作的数据和/或逻辑。
尝试搜索“Windows forms mvc”或“windows forms mvp”。
MVP:http: //msdn.microsoft.com/en-us/magazine/cc188690.aspx
MVC :使用 Windows 窗体实现 MVC
你真正应该做的是使用Model/View/Controller
orModel/View/Presenter
模式。
本质上,您所做的是使 Form 类(即View
类)变得非常愚蠢。当各种事件(例如按钮按下)发生时,它不知道该怎么做。相反,它引发事件以指示发生了什么。
然后你编写一个Controller
类,它负责创建View
并附加到它的事件。Controller
知道按下按钮时要做什么,并做出相应的响应(可能通过调用方法或在类中设置属性)View
。
这Model
只是用于Controller
填充View
类的数据的抽象。
理想情况下,他们View
对Model
. Controller
是负责坐在Model
和之间的实体View
。
这种方法使您可以将业务逻辑从表单中分离出来,这简化了事情并使得更改事情和单元测试变得更加容易。
我不久前在这里发布了一个关于此的示例:https ://stackoverflow.com/a/15605436/106159
您应该尝试将 UI 逻辑与“业务逻辑”分开,将其移出事件并放入新类中。
例如,如果你现在有:
// in Form1.cs
private void btn_Click(object sender, System.EventArgs e) {
OpenDatabaseConnection();
string customerName=SearchCustomerByCode(someTextBox.Text);
someOtherTextBox.Text=customerName;
CloseDatabaseConnection();
}
你应该有这样的东西:
// in Form1.cs
private void btn_Click(object sender, System.EventArgs e)
{
string customerCode=someTextBox.Text;
var cs = new CustomerRepository();
string customerName=cs.SearchCustomerByCode(customerCode);
someOtherTextBox.Text=customerName;
}
// in CustomerRepository.cs
//... logic to get the data from the DB, no specific knowledge of form1
public class CustomerRepository.cs
{
public string SearchCustomerByCode(string customerCode)
{
//...
}
}
你可以做这样的事情,这会奏效,但不是很好。
表格 1
public partial class Form1 : Form
{
Form2 f2 = new Form2();
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Test");
f2.ShowDialog();
}
}
表格 2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.button1_Click(null, null);
}
}