ถ้าเราอยากจะได้การส่ง ข้อมูลที่ง่าย และรวดเร็ว ส่งผ่านฟอร์มใดๆก็ได้อย่างอิสระ ไม่ต้องยุ่งกับเรื่อง Modifier ของ Properties แนะนำให้สร้างอีเว้นท์ขึ้นมาเองครับ สร้างครั้งเดียว แล้วเอาไปใช้กับงานหน้าได้ด้วย
ทำตามสเต็ปนี้ครับ
1. สร้างดีลีเกตและอีเว้นท์ขึ้นมารองรับการส่งข้อมูลข้ามฟอร์ม
2. ผูกอีเว้นท์เข้ากับเมธอด บน Source code ของฟอร์มแม่
3. ฟอร์มไหนจะส่งข้อมูลผ่านอีเว้นท์ ก็เรียกอีเว้นนั้น พร้อมส่งข้อมูลผ่านอาร์กิวเม้นท์ไป
1. สร้างดีลีเกตและอีเว้นท์ขึ้นมารองรับการส่งข้อมูลข้ามฟอร์ม
อัน นี้เราจะสร้างดีลีเกต ที่สามารถส่งพารามิเตอร์ไปกี่ตัวก็ได้นะครับ จะยืดหยุ่นมาก เพราะฟอร์มลูกแต่ละตัว อาจจะส่งข้อมูลไปให้ฟอร์มแม่ หรือ ฟอร์มลูกตัวอื่นไม่เท่ากัน ไปดูกันเลย
ผมจะสร้างไฟล์ขึ้นมาอันนึงแล้ว สร้างคลาสขึ้นมาอันนึงเพื่อทำเป็น EventArgument ในแบบของเราเอง
โค๊ด:
public class ParamEventArgs : EventArgs
{
private List
และก็สร้างดีลีเกตที่มีรูปแบบเหมาะสมสำหรับส่งข้อมูลข้ามฟอร์มมารองรับ
โค๊ด:
public delegate void OnChildFormSendingData(object sender, ParamEventArgs e);
แล้วก็เซฟไฟล์ครับ
ทีนี้มาดูในฟอร์มลูก เราก็ประกาศอีเว้นท์ให้มันก่อน เอาเป็นชื่อ OnSendingData ละกัน
โค๊ด:
public event OnChildFormSendingData OnSendingData;
พอ ถึงตรงที่จะให้มันส่งข้อมูลก็เรียกอีเว้นท์นี้ขึ้นมา สมมุตถ้า Button1 ถูกคลิกละกัน ผมก็จะเอาข้อมูลใส่ใน ParamEventArgs เพื่อที่จะส่งไป จะมีกี่ตัวก็ยัดไปเลยครับ
โค๊ด:
private void Button1_Click(object sender, EventArgs e)
{
List paramList = new List();
paramList.Add("ข้อมูล1");
paramList.Add(true);
paramList.Add(150);
OnSendingData(sender, new ParamEventArgs(paramList));
}
ที่ นี้พอคลิกปุ่ม Button1 อีเว้นท์นี้ก็จะถูกเรียก แต่ก็ไม่มีอะไรเกิดขึ้น เพราะ เรายังไม่ได้ผูกอีเ้ว้นท์นี้กับเมธอดใดๆในฟอร์มอื่นเลย(หมายถึงฟอร์มแม่ หรือ ฟอร์มลูกตัวอื่นอ่านะ) งั้นเราก็ไปผูกให้มันซะ หากมองตามขอบเขตการมองเห็นแล้ว พื้นที่ที่จะมองเห็นได้กว้างที่สุด ก็คือในคลาสของฟอร์มแม่ งั้นเราก็ไปเขียนลงบน คอนสตรัคเตอร์ของฟอร์มแม่เลยดีกว่า
สมมุติว่าฟอร์มแม่ชื่อ ParentForm และฟอร์มลูกตัวที่ทริกเกอร์ OnSendingData Event ชื่อ Child1
โค๊ด:
public ParentForm()
{
Initialize();
Child1.OnSendingData = new OnChildFormSendingData(this.myMethod);
}
private void myMethod(object sender, ParamEventArgs e)
{
MessageBox.show("This is param1 : " e.Param[0]).toString());
MessageBox.show("This is param2 : " e.Param[1]).toString());
MessageBox.show("This is param3 : " e.Param[2]).toString());
}
ผูกอีเว้น OnSendingData ด้วยการสร้างดีลีเกต OnChildFormSendingData ข้างในวงเล็บเอาชื่อเมธอดที่จะเรียกให้ทำงานด้วยใส่เข้าไป
จะเห็นได้ว่า ผมจะผูกกี่เมธอดก็ได้นะ จะผูกของฟอร์มลูกตัวอื่นก็ได้
โค๊ด:
public ParentForm()
{
Initialize();
Child1.OnSendingData = new OnChildFormSendingData(this.myMethod);
Child1.OnSendingData = new OnChildFormSendingData(Child2.myChild2Method);
Child1.OnSendingData = new OnChildFormSendingData(Child3.myChild3Method);
Child1.OnSendingData = new OnChildFormSendingData(Child4.myChild4Method);
}
private void myMethod(object sender, ParamEventArgs e)
{
MessageBox.show("This is param1 : " e.Param[0]).toString());
MessageBox.show("This is param2 : " e.Param[1]).toString());
MessageBox.show("This is param3 : " e.Param[2]).toString());
}
อาจ จะยุ่งยากครับ แต่อย่างที่บอก สร้างดีลีเกต กับ EventArgs มาครั้งเดียวเอาไปใช้ได้หลายงานเลย แต่ถ้าส่งข้อมูลไม่มากก็ปรับ Property ของฟอร์มแม่เป็น Public ก็ได้ครับผม
อ้างอิง : http://www.thaiseoboard.com
ไม่มีความคิดเห็น:
แสดงความคิดเห็น