Passing data between two Forms in WinForms(二)

话题#1:可重用性

这种方法的第一个话题就是可重用性。想像一下在下个星期,你想要从另一个Form中使用Form2,比如说是Form3。你想要收集相同的数据,但希望以不同的方式呈现。现在你的Form不是那么具备可重用性,因为不清楚谁会调用Form。

话题#2:更多知识

一般来说,被调用的对象应该对调用它的对象知之甚少甚至一无所知。Form2没有理由要知道可能会使用到Form2的其它Form、用户控件、类库等等这些。你不应该用一堆if/else语句来处理这种逻辑。接下来想象一下,我们有两个窗体(一个employee 和一个student),还有一个增加的类库,没有自己的用户界面,全部使用Details Form来获取名字和年龄。

 

 1 public partial class StudentForm : Form
 2 {
 3     private void btnGetStudentData_Click(object sender, EventArgs e)
 4     {
 5         using (var detailForm = new DetailForm(this))
 6         {
 7             detailForm.ShowDialog();
 8         }
 9     }
10  
11     public void SetStudentName(string name)
12     {
13         lblStudentName.Text = name;
14     }
15 }
16  
17 public partial class EmployeeForm : Form
18 {
19     private void btnGetEmployeeInput_Click(object sender, EventArgs e)
20     {
21         using (var detailForm = new DetailForm(this))
22         {
23             detailForm.ShowDialog();
24         }
25     }
26  
27     public string EmployeeName { get; set; }
28 }
29  
30 public class SomeClass
31 {
32     public void SomeMethod()
33     {
34         using (var detailForm = new DetailForm(this))
35         {
36             detailForm.ShowDialog();
37         }
38     }
39  
40     public string Name { get; set; }
41 }
42  
43 public partial class DetailForm : Form
44 {
45     private StudentForm studentForm;
46     private EmployeeForm employeeForm;
47     private SomeClass someClass;
48  
49     public DetailForm(StudentForm form)
50     {
51         InitializeComponent();
52         studentForm = form;
53     }
54  
55     public DetailForm(EmployeeForm form)
56     {
57         InitializeComponent();
58         employeeForm = form;
59     }
60  
61     public DetailForm(SomeClass someClass)
62     {
63         InitializeComponent();
64         this.someClass = someClass;
65     }
66  
67     private void btnClose_Click(object sender, EventArgs e)
68     {
69         if (studentForm != null)
70             studentForm.SetStudentName(txtName.Text);
71         else if (employeeForm != null)
72             employeeForm.EmployeeName = txtName.Text;
73         else if (someClass != null)
74             someClass.Name = txtName.Text;
75  
76         this.Close();
77     }
78 }

 

DetailForm窗体知道太多关于可能存在调用它的方式,并且必须为每个可能的调用者做好准备---事情很快会变得很糟糕。此处,对其中一个调用者进行更改需要更改共享的Form。

 

posted @ 2022-08-13 11:17  chenlight  阅读(16)  评论(0编辑  收藏  举报