C#子窗体给父窗体传值的几种方法
一、我们举个小例子,分别用几种不同的方法来实现。比如:我们现在有教师、学生两个类,教师类是学生类的父类,也就是教师类中可以实例化出来多个不同的学生类。现在,学生有两个功能, ①、在班级向大家自我介绍,让其它同学们认识他, ②、向老师索要自己的学习成绩和排名。教师的职责有三个:①、可以实例化出不同的学生来 ②、可以命令学生在班级进行自我介绍 ③、对于学生提出查看学习成绩的需求,给出答复。
1、第一种方法:利用委托和事件
对于大型的应用程序,都会利用面向对象的逻辑来实现的,对于定义的委托和事件,我们可以写到一个专用的类中,后面新类可以继承这个专用类。方便的利用定义好的委托和事件。
①、定义好专门的类(AllMethodsClass)用来盛放窗体通信的方法。
namespace ConsoleApp1.Methods
{
public class AllMethodsClass
{
public delegate int GetMyScore(string studentName);//定义好的委托
}
}
②、定义教师类
namespace ConsoleApp1.Methods
{
public class TeacherClass: AllMethodsClass
{
public Dictionary
StudentClass student1;
StudentClass student2;
public TeacherClass()
{
//构造函数初始化成绩表
studentInfos.Add("LiMing", 98);
studentInfos.Add("XiaoHong", 97);
}
//实例化新学生的方法
private void CreateNewStudent()
{
student1 = new StudentClass("LiMing");//实例化名字为LiMing的学生
student1.getMyScore += GetStudentScore;//对学生类中的事件getMyScore绑定相应的方法
student2 = new StudentClass("XiaoHong");
student2.getMyScore += GetStudentScore;
}
//让学生介绍自己
private void IntroduceStudent()
{
student1.Introduce();//直接通过相应子类调用即可
}
//得到学生的成绩并返回,如果成绩表没有则返回0
private int GetStudentScore(string name)
{
if (studentInfos.ContainsKey(name))
{
return studentInfos[name];
}
return 0;
}
}
}
③、定义学生类
namespace ConsoleApp1.Methods
{
public class StudentClass: AllMethodsClass
{
public event GetMyScore getMyScore;//定义得到学生成绩的事件
private string _myName;//用来存储个人姓名
public StudentClass(string name)
{
_myName = name;
}
//介绍自己的方法
public void Introduce()
{
string str = string.Format("我的名字叫:{0}", _myName);
Console.WriteLine(str);
}
//获得成绩方法
private void GetScore()
{
int score = getMyScore.Invoke(_myName);//在此得到个人成绩,并保存在变量score中
}
}
}
2、父类中定义静态方法,让子类直接调用
①、定义教师类
namespace ConsoleApp1.Methods
{
public class TeacherClass
{
public static Dictionary
StudentClass student1;
StudentClass student2;
public TeacherClass()
{
//构造函数初始化成绩表
studentInfos.Add("LiMing", 98);
studentInfos.Add("XiaoHong", 97);
}
//实例化新学生的方法
public void CreateNewStudent()
{
student1 = new StudentClass("LiMing");
student2 = new StudentClass("XiaoHong");
}
//让学生介绍自己
private void IntroduceStudent()
{
student1.Introduce();
}
//得到学生的成绩并返回,如果成绩表没有则返回0
public static int GetStudentScore(string name)
{
if (studentInfos.ContainsKey(name))
{
return studentInfos[name];
}
return 0;
}
}
}
②、定义学生类
namespace ConsoleApp1.Methods
{
public class StudentClass
{
private string _myName;
public StudentClass(string name)
{
_myName = name;
}
//介绍自己的方法
public void Introduce()
{
string str = string.Format("我的名字叫:{0}", _myName);
Console.WriteLine(str);
}
private void GetScore()
{
int score = TeacherClass.GetStudentScore(_myName);//在此直接得到个人成绩
}
}
}
3、还有一种利用事件子窗体调用父窗体方法,但是此方法不能有返回值。在我不知道第一种方法之前,我一直使用的第二种方法,跟传值的有关的地方都得写成静态的,即使是控件也是自己实例化为静态的,在实际应用起来相当的麻烦,且容易出问题。第一种方法是安全高效的,非常完美,后来我一直使用第一种方法。
第三种方法就不能有返回值了,只能子窗体调用父窗体的方法。现在需要稍微改动一下题目规则,就是学生想要知道自己的成绩的话,需要告诉老师,然后只能让老师有说出来学生成绩的动作。
①、定义教师类
namespace ConsoleApp1.Methods
{
public class TeacherClass
{
public Dictionary
StudentClass student1;
StudentClass student2;
public TeacherClass()
{
//构造函数初始化成绩表
studentInfos.Add("LiMing", 98);
studentInfos.Add("XiaoHong", 97);
}
public void CreateNewStudent()
{
student1 = new StudentClass("LiMing");
student1.GetMyScore += GetStudentScore;
}
private void IntroduceStudent()
{
student1.Introduce();
}
public void GetStudentScore(object sender, string name)
{
string str = "";
if (studentInfos.ContainsKey(name))
{
str = string.Format("{0}的成绩为: {1}", name, studentInfos[name]);
Console.WriteLine(str);
}
else
{
Console.WriteLine(str);
}
}
}
}
②、定义学生类
namespace ConsoleApp1.Methods
{
public class StudentClass
{
public EventHandler
private string _myName;
public StudentClass(string name)
{
_myName = name;
}
public void Introduce()
{
string str = string.Format("我的名字叫:{0}", _myName);
Console.WriteLine(str);
}
private void GetScore()
{
GetMyScore.Invoke(null, _myName);//在此告诉老师需要知道自己的成绩,没有返回值
}
}
}