窗体类:所有的窗体类均继承于Form类,用来与用户进行交互。
定义的窗体类包括两个部分类:Form.cs和Form.Designer.cs,后者是程序自动帮我们生成的,包括全局设定方法,退出方法,控件声明,窗体初始化方法。前者需要我们自己定义,包括构造方法,事件方法:加载事件方法(界面显示前执行)和用户事件方法(用户触发事件后执行),字段和属性。我们还可以在视图化设计器中,设置控件的属性和事件,系统会自动在Designer中为我们添加。(当想取消注册的事件时,在设计器中在事件名上点击右键重置,就取消了Designer中的事件)
窗体类的执行过程:1 Application.Run(new Form1())----2定义全局变量,调用构造方法,创建对象----3-Form_Load事件,显示,加载对象-----4事件注册方法监听用户事件进行消息循环----5 点击关闭或调用Exit()方法,执行Dispose方法,销毁对象。
窗体间的控制与相互传值:主窗体与子窗体之间引用(类实例和委托变量)的相互传递。从而得到引用并调用其属性和方法。
1 添加两个窗体类,其中一个作为主窗体类,一个作为子窗体类 。
2 在主窗体类中依次添加以下事件方法:创建子窗体对象,显示子窗体对象,隐藏子窗体对象,销毁子窗体对象。
3 构造方法--属性模型:关键是通过构造方法传参得到类实例的引用,
主窗体向子窗体传值:(1)在加载窗体前传值即在窗体初始化时传值:在主窗体类中声明子窗体类的实例,得到引用并调用构造方法,以方法的参数的形式传递过去(需要在子窗体类中再定义一个有参数的构造方法用来接受父窗体对象传递来的值),此有参的构造方法需调用子窗体类的无参的构造方法(方法是 :子窗体类名(参数列表):this())(2)在加载以后,初始化窗体以后传值,直接用子窗体实例名.属性修改值
子窗体向主窗体传值,先得到父窗体对象的引用,故需先将其引用传递过去,依旧通过构造方法将自己的引用传给子窗体类,然后在子窗体类中定义字段接受,即可进行传值。
例子:
主窗体类
public partial class Form1 : Form
{
Form fm2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str = "创建时构造方法传值";
fm2 = new Form2(str ,this );
}
private void button2_Click(object sender, EventArgs e)
{
fm2.Show();
}
private void button3_Click(object sender, EventArgs e)
{
fm2.Text = "创建后属性传值";
}
}
子窗体类
public partial class Form2 : Form
{
Form fm;
public Form2()
{
InitializeComponent();
}
public Form2(string text, Form fm)
: this()
{
this.Text = text;
this.fm = fm;
}
private void button1_Click(object sender, EventArgs e)
{
fm.Text = "子窗体向父窗体传值";
}
}
4委托调用模型:
为什么使用委托: 当方法为私有时,在外部用委托(public)调用。2 可实现方法的多态:相同的方法签名,不同的代码实现不同的功能。
委托是一种类型,是方法的别名,表示一类函数的类型(函数签名相同的一类方法),故调用委托时能根据传递的方法的不同而实现多态。
类变量存的是对象(属性)的地址,委托变量存的是类(对象)的方法的地址。委托的本质或委托与函数指针的区别:
指针指向函数的首地址,通过指针可找到函数,类型不安全。委托是面向对象的,基于类类型,(基类是object,)有强大的父类成员来维护方法的引用,类型安全
委托的使用:
object--delegate--multicastdelegate--自己定义的delegate类型
准备方法---准备委托类型---定义委托变量----使用,
定义委托:[访问修饰符] delegate 返回类型 委托名 (参数类型);
public delegate void delegatefunc();
定义委托类型的方法,方法签名相同,参数和返回类型相同 。
public void func()
{
}
定义委托变量:delegatefunc mydelegate=func;
或F f=new F();delegatefunc mydelegate=f.func;
使用:mydelegate();
委托传值:在第一个类中 定义好委托,方法后,在第二个类中,定义委托变量并赋值,调用委托即可执行第一个类中的方法体。
例子:
public delegate void delegatefunc(); 调用方法为私有的时,在类的构造函数中为方法定义委托。并用关键字out将 委托引用传递出去,然后在外部类中声明要接收传递的委托引用的委托变量。 调用构造方法,为委托变量赋值引用,就可以使用委托调方法了。 class Program { static void Main(string[] args) { delegatefunc myd; ff f = new ff( out myd ); myd(); 相当于调用myd.Invoke()方法,遍历执行委托中添加的方法。 delegatefunc myd1; 委托链,为委托变量依次添加方法,会依次执行每个方法。 myd1 = f.func1; myd1 += f.func2; myd1 += f.func3; myd1(); } } class ff { public ff() { } public ff( out delegatefunc dg) { dg = func; } private static void func() { Console.WriteLine("你好"); Console.ReadKey(); } public void func1() { Console.WriteLine("呵呵"); } public void func2() { } public void func3() { }