C#子窗體給父窗體傳值的幾種方法

C#子窗體給父窗體傳值的幾種方法

一癞谒、我們舉個(gè)小例子啊掏,分別用幾種不同的方法來(lái)實(shí)現(xiàn)梗搅。比如:我們現(xiàn)在有教師禾唁、學(xué)生兩個(gè)類(lèi),教師類(lèi)是學(xué)生類(lèi)的父類(lèi)无切,也就是教師類(lèi)中可以實(shí)例化出來(lái)多個(gè)不同的學(xué)生類(lèi)〉炊蹋現(xiàn)在,學(xué)生有兩個(gè)功能哆键, ①掘托、在班級(jí)向大家自我介紹,讓其它同學(xué)們認(rèn)識(shí)他籍嘹, ②闪盔、向老師索要自己的學(xué)習(xí)成績(jī)和排名。教師的職責(zé)有三個(gè):①辱士、可以實(shí)例化出不同的學(xué)生來(lái) ②泪掀、可以命令學(xué)生在班級(jí)進(jìn)行自我介紹 ③、對(duì)于學(xué)生提出查看學(xué)習(xí)成績(jī)的需求颂碘,給出答復(fù)异赫。

1、第一種方法:利用委托和事件

對(duì)于大型的應(yīng)用程序头岔,都會(huì)利用面向?qū)ο蟮倪壿媮?lái)實(shí)現(xiàn)的塔拳,對(duì)于定義的委托和事件,我們可以寫(xiě)到一個(gè)專用的類(lèi)中切油,后面新類(lèi)可以繼承這個(gè)專用類(lèi)蝙斜。方便的利用定義好的委托和事件。

①澎胡、定義好專門(mén)的類(lèi)(AllMethodsClass)用來(lái)盛放窗體通信的方法孕荠。

namespace ConsoleApp1.Methods

{

? ? public class AllMethodsClass

? ? {

? ? ? ? public delegate int GetMyScore(string studentName);//定義好的委托

? ? }

}

②、定義教師類(lèi)

namespace ConsoleApp1.Methods

{

? ? public class TeacherClass: AllMethodsClass

? ? {

? ? ? ? public Dictionary<string, int> studentInfos = new Dictionary<string, int>();//存放學(xué)生的成績(jī)信息

? ??????StudentClass student1;

? ? ? ? StudentClass student2;

? ? ? ? public TeacherClass()

? ? ? ? {

? ? ? ? ? ? //構(gòu)造函數(shù)初始化成績(jī)表

? ? ? ? ? ? studentInfos.Add("LiMing", 98);

? ? ? ? ? ? studentInfos.Add("XiaoHong", 97);

? ? ? ? }

? ??????//實(shí)例化新學(xué)生的方法

? ? ? ? private void CreateNewStudent()

? ? ? ? {

? ? ? ? ? ? student1 = new StudentClass("LiMing");//實(shí)例化名字為L(zhǎng)iMing的學(xué)生

? ? ? ? ? ? student1.getMyScore += GetStudentScore;//對(duì)學(xué)生類(lèi)中的事件getMyScore綁定相應(yīng)的方法

? ? ? ? ? ? student2 = new StudentClass("XiaoHong");

? ? ? ? ? ? student2.getMyScore += GetStudentScore;

? ? ? ? }

? ??????//讓學(xué)生介紹自己

? ??????private void IntroduceStudent()

? ? ? ? {

? ? ? ? ? ? student1.Introduce();//直接通過(guò)相應(yīng)子類(lèi)調(diào)用即可

? ? ? ? }

? ??????//得到學(xué)生的成績(jī)并返回攻谁,如果成績(jī)表沒(méi)有則返回0

? ? ? ? private int GetStudentScore(string name)

? ? ? ? {

? ? ? ? ? ? if (studentInfos.ContainsKey(name))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return studentInfos[name];

? ? ? ? ? ? }

? ? ? ? ? ? return 0;

? ? ? ? }

? ? }

}

③稚伍、定義學(xué)生類(lèi)

namespace ConsoleApp1.Methods

{

? ? public class StudentClass: AllMethodsClass

? ? {

? ? ? ? public event GetMyScore getMyScore;//定義得到學(xué)生成績(jī)的事件

? ? ? ? private string _myName;//用來(lái)存儲(chǔ)個(gè)人姓名

? ? ? ? public StudentClass(string name)

? ? ? ? {

? ? ? ? ? ? _myName = name;

? ? ? ? }

? ??????//介紹自己的方法

? ??????public void Introduce()

? ? ? ? {

? ? ? ? ? ? string str = string.Format("我的名字叫:{0}", _myName);

? ? ? ? ? ? Console.WriteLine(str);

? ? ? ? }

? ??????//獲得成績(jī)方法

? ? ? ? private void GetScore()

? ? ? ? {

? ? ? ? ? ? int score = getMyScore.Invoke(_myName);//在此得到個(gè)人成績(jī),并保存在變量score中

? ? ? ? }

? ? }

}

2戚宦、父類(lèi)中定義靜態(tài)方法个曙,讓子類(lèi)直接調(diào)用

①、定義教師類(lèi)

namespace ConsoleApp1.Methods

{

? ? public class TeacherClass

? ? {

? ? ? ? public static Dictionary<string, int> studentInfos = new Dictionary<string, int>();//存放學(xué)生的成績(jī)信息

? ? ? ? StudentClass student1;

? ? ? ? StudentClass student2;

? ? ? ? public TeacherClass()

? ? ? ? {

? ? ? ? ? ? //構(gòu)造函數(shù)初始化成績(jī)表

? ? ? ? ? ? studentInfos.Add("LiMing", 98);

? ? ? ? ? ? studentInfos.Add("XiaoHong", 97);

? ? ? ? }

? ??????//實(shí)例化新學(xué)生的方法

? ? ? ? public void CreateNewStudent()

? ? ? ? {

? ? ? ? ? ? student1 = new StudentClass("LiMing");

? ? ? ? ? ? student2 = new StudentClass("XiaoHong");

? ? ? ? }

? ??????//讓學(xué)生介紹自己

? ? ? ? private void IntroduceStudent()

? ? ? ? {

? ? ? ? ? ? student1.Introduce();

? ? ? ? }

? ??????//得到學(xué)生的成績(jī)并返回,如果成績(jī)表沒(méi)有則返回0

? ? ? ? public static int GetStudentScore(string name)

? ? ? ? {

? ? ? ? ? ? if (studentInfos.ContainsKey(name))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return studentInfos[name];

? ? ? ? ? ? }

? ? ? ? ? ? return 0;

? ? ? ? }

? ? }

}

②垦搬、定義學(xué)生類(lèi)

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);//在此直接得到個(gè)人成績(jī)

? ? ? ? }

? ? }

}

3呼寸、還有一種利用事件子窗體調(diào)用父窗體方法,但是此方法不能有返回值猴贰。在我不知道第一種方法之前对雪,我一直使用的第二種方法,跟傳值的有關(guān)的地方都得寫(xiě)成靜態(tài)的米绕,即使是控件也是自己實(shí)例化為靜態(tài)的瑟捣,在實(shí)際應(yīng)用起來(lái)相當(dāng)?shù)穆闊胰菀壮鰡?wèn)題栅干。第一種方法是安全高效的迈套,非常完美,后來(lái)我一直使用第一種方法碱鳞。

第三種方法就不能有返回值了桑李,只能子窗體調(diào)用父窗體的方法。現(xiàn)在需要稍微改動(dòng)一下題目規(guī)則窿给,就是學(xué)生想要知道自己的成績(jī)的話芙扎,需要告訴老師,然后只能讓老師有說(shuō)出來(lái)學(xué)生成績(jī)的動(dòng)作填大。

①戒洼、定義教師類(lèi)

namespace ConsoleApp1.Methods

{

? ? public class TeacherClass

? ? {

? ? ? ? public Dictionary<string, int> studentInfos = new Dictionary<string, int>();//存放學(xué)生的成績(jī)信息

? ? ? ? StudentClass student1;

? ? ? ? StudentClass student2;

? ? ? ? public TeacherClass()

? ? ? ? {

? ? ? ? ? ? //構(gòu)造函數(shù)初始化成績(jī)表

? ? ? ? ? ? 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}的成績(jī)?yōu)椋?{1}", name, studentInfos[name]);

? ? ? ? ? ? ? ? Console.WriteLine(str);

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Console.WriteLine(str);

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

②、定義學(xué)生類(lèi)

namespace ConsoleApp1.Methods

{

? ? public class StudentClass

? ? {

? ? ? ? public EventHandler<string> GetMyScore { get; set; }

? ? ? ? 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);//在此告訴老師需要知道自己的成績(jī)允华,沒(méi)有返回值

? ? ? ? }

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圈浇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靴寂,更是在濱河造成了極大的恐慌磷蜀,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件百炬,死亡現(xiàn)場(chǎng)離奇詭異褐隆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剖踊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)庶弃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人德澈,你說(shuō)我怎么就攤上這事歇攻。” “怎么了梆造?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵缴守,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)屡穗,這世上最難降的妖魔是什么贴捡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮村砂,結(jié)果婚禮上栈暇,老公的妹妹穿的比我還像新娘。我一直安慰自己箍镜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布煎源。 她就那樣靜靜地躺著色迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪手销。 梳的紋絲不亂的頭發(fā)上歇僧,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音锋拖,去河邊找鬼诈悍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兽埃,可吹牛的內(nèi)容都是我干的侥钳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柄错,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舷夺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起售貌,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤给猾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后颂跨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體敢伸,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年恒削,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了池颈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钓丰,死狀恐怖饶辙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斑粱,我是刑警寧澤弃揽,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響矿微,放射性物質(zhì)發(fā)生泄漏痕慢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一涌矢、第九天 我趴在偏房一處隱蔽的房頂上張望掖举。 院中可真熱鬧,春花似錦娜庇、人聲如沸塔次。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)励负。三九已至,卻和暖如春匕得,著一層夾襖步出監(jiān)牢的瞬間继榆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工汁掠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留略吨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓考阱,卻偏偏與公主長(zhǎng)得像翠忠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乞榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一. ArrayList嵌套 定義在集合中存放集合,和二維數(shù)組類(lèi)似 演示public static void ma...
    拼搏男孩閱讀 108評(píng)論 0 1
  • 一. StringBuffer 定義線程安全的可變字符序列, 一個(gè)類(lèi)似于String的字符緩沖區(qū), 我們可以將St...
    拼搏男孩閱讀 153評(píng)論 0 1
  • 構(gòu)造函數(shù)與析構(gòu)函數(shù) OOP第二課 1负间、構(gòu)造函數(shù) 1.1 構(gòu)造函數(shù)具有一些特殊的性質(zhì) 1.2 定義構(gòu)造函數(shù)的一般形式...
    代碼人生ll閱讀 824評(píng)論 0 0
  • 學(xué)習(xí)集合之前復(fù)習(xí)相關(guān)知識(shí): Hash:翻譯為散列、哈希姜凄,所以散列和哈希指的是同一個(gè)概念政溃。散列碼:一種標(biāo)識(shí)碼,由散列...
    教堂白鴿閱讀 236評(píng)論 0 1
  • import java.util.HashMap; import java.util.Iterator; impo...
    長(zhǎng)布閱讀 169評(píng)論 0 0