窗體類:所有的窗體類均繼承於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();
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) 在類內部聲明公共的委託屬性,在構造方法中爲其初始化,爲其賦值爲類的私有的方法。然後將公共的委託引用傳遞(out)給外部類,外部類中調用類的構造方法時就初始化對象的屬性包括 公共委託屬性,並通過構造方法參數的形式得到公共委託的引用,就能在外部類中通過調用公共的委託來調用類的私有方法。
{
dg = func;
}
private static void func()
{
Console.WriteLine("你好");
Console.ReadKey();
}
public void func1()
{
Console.WriteLine("呵呵");
}
public void func2()
{
}
public void func3()
{
}