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。