我的form1(设计)中有一个按钮,但在我的form1(Class)中它变得非常拥挤,所以我想创建一个新类。但是如何使按钮在新类中工作(新类名称为form2(Class)。当然该函数适用于form1(Class)中的按钮,那么如何使它从form2(Class)开始工作?< / p>
答案 0 :(得分:5)
使用自己的UserControl
和逻辑创建自己的自定义Controls
。或者为partial class
创建From1
并将事件逻辑放在那里。
答案 1 :(得分:1)
将UI代码(例如按钮事件处理)与应用程序的核心逻辑分开是值得考虑的。
有很多方法可以做到这一点,但常见的地方是使用一个模型类来表示窗口正在操作的数据和/或逻辑。
尝试搜索“Windows窗体mvc”或“windows窗体mvp”。
答案 2 :(得分:0)
您应该使用Model/View/Controller
或Model/View/Presenter
模式。
基本上你要做的是使Form类(View
类)非常愚蠢。当发生各种事件(例如按钮按下)时,它不知道该怎么做。相反,它会引发事件以指示发生了什么。
然后你写了一个Controller
类,负责创建View
并附加到它的事件。 Controller
知道按下按钮时该怎么做,并相应地做出响应(可能通过调用方法或设置View
类中的属性)。
Model
只是Controller
填充View
类所用数据的抽象。
理想情况下,View
对Model
一无所知。 Controller
是负责坐在Model
和View
之间的实体。
这种方法允许您将业务逻辑从表单中分离出来,这样可以简化事情并使更改事物和单元测试变得更加容易。
我刚刚在这里发布了一个关于此的示例:https://stackoverflow.com/a/15605436/106159
答案 3 :(得分:0)
您应该尝试将UI逻辑从“业务逻辑”中解放出来,将其从事件中移出并在新的类中。
e.g。如果你现在有:
// 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)
{
//...
}
}
答案 4 :(得分:0)
你可以做类似的事情,这可行,但它有点粪便
表格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);
}
}