ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์ProgrammingC# เขียน application แบบ MDI อยากให้ฟอร์มลูกแก้ไข property ของ ฟอร์มแม่
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: C# เขียน application แบบ MDI อยากให้ฟอร์มลูกแก้ไข property ของ ฟอร์มแม่  (อ่าน 4533 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
picharnan
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 90
ออฟไลน์ ออฟไลน์

กระทู้: 1,400



ดูรายละเอียด
« เมื่อ: 11 กุมภาพันธ์ 2011, 01:13:26 »

ตอนนี้ผมกำลังเขียนโปรแกรมด้วย C# อยู่ครับ  แบบว่าไม่มีประสบการณ์ในการเขียนมาก่อนเลย แล้วผมก็เริ่มศึกษา

จนเริ่มเขียน application แบบ MDI ซึ่งการเขียนแบบ MDI นี้เองที่ทำให้ผมเจอปัญหา  ว่าแล้วเข้าเรื่องเลยดีกว่า


ผมอยากจะให้ event ของ control ที่อยู่ในฟอร์มลูก ไปแก้ไข propterty ของ control ที่อยู่ในฟอร์แม่อ่ะครับ  ต้องทำอย่างไร ?

 Tongue Tongue
บันทึกการเข้า
kenessar
ก๊วนเสียว
*

พลังน้ำใจ: 34
ออฟไลน์ ออฟไลน์

กระทู้: 342



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 12 กุมภาพันธ์ 2011, 14:56:25 »

การที่จะแก้ไขฟอร์มแม่ หรือ แก้ผ่านฟอร์มลูกอื่น มีวิธีที่ดีมากอย่างหนึ่งคือ สร้างอีเว้นท์ขึ้นมาครับ เราก็เขียนผูกอีเว้นท์ในฟอร์มลูก เข้ากับเมธอดในฟอร์มแม่ครับ
พอถึงตอนที่จะแก้ไขพรอพเพอร์ตี้ในฟอร์มแม่ ก็ทำการ Fire Event ในฟอร์มลูก มันก็จะเด้งเข้าไปในเมธอดที่เราผูกไว้ งงมั้ย  Tongue
บันทึกการเข้า


picharnan
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 90
ออฟไลน์ ออฟไลน์

กระทู้: 1,400



ดูรายละเอียด
« ตอบ #2 เมื่อ: 12 กุมภาพันธ์ 2011, 15:21:34 »

ผมอยากทราบจังเลยครับว่าผมจะผูก event ของ child form กับ method ของ parent form ยังไงครับ  รบกวนยกตัวอย่างให้หน่อยสิครับ

เพราะผมไม่ทราบว่าเวลาที่รันไปแล้ว parent form เราจะอ้างอิงยังไง  แต่ถ้าผมเข้าใจไม่ผิดเป้น แบบนี้ใช่หรือเปล่าครับ
โค๊ด:
(this.MdiParent as [ParentForm])


เนื่องจากผมยังไม่เข้าใจโครงสร้างของ C# ดีพอ  เลยทำให้ไม่สามารถเข้าไปที่ MdiParent ได้อ่ะครับ แต่ตอนนี้ผมหาคำตอบได้แล้วครับ

โค๊ด:
(this.MdiParent as [ParentForm]).[Control].Enabled = true;

ผมก็เอา โค๊ดด้านบนไปวางใน Event ของ Control ที่ต้องการให้ handle event ของ ฟอร์มลูกครับ  และ Modifier ต้องเป็น public ด้วยนะเธอว์
บันทึกการเข้า
kenessar
ก๊วนเสียว
*

พลังน้ำใจ: 34
ออฟไลน์ ออฟไลน์

กระทู้: 342



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 12 กุมภาพันธ์ 2011, 15:40:37 »

ผมอยากทราบจังเลยครับว่าผมจะผูก event ของ child form กับ method ของ parent form ยังไงครับ  รบกวนยกตัวอย่างให้หน่อยสิครับ

เพราะผมไม่ทราบว่าเวลาที่รันไปแล้ว parent form เราจะอ้างอิงยังไง  แต่ถ้าผมเข้าใจไม่ผิดเป้น แบบนี้ใช่หรือเปล่าครับ
โค๊ด:
(this.MdiParent as [ParentForm])


เนื่องจากผมยังไม่เข้าใจโครงสร้างของ C# ดีพอ  เลยทำให้ไม่สามารถเข้าไปที่ MdiParent ได้อ่ะครับ แต่ตอนนี้ผมหาคำตอบได้แล้วครับ

โค๊ด:
(this.MdiParent as [ParentForm]).[Control].Enabled = true;

ผมก็เอา โค๊ดด้านบนไปวางใน Event ของ Control ที่ต้องการให้ handle event ของ ฟอร์มลูกครับ  และ Modifier ต้องเป็น public ด้วยนะเธอว์

ทำแบบนี้ก็ได้ครับ ง่ายดีครับ
แต่หากต้องการตัวอย่างการผูกอีเว้นท์ อันนี้ั เดี๋ยวหาตัวอย่างมาให้ครับ ที่ผมแนะนำเรื่องการผูกอีเว้นท์ อันนี้เพราะมันเอาไปประยุกษต์ใช้ได้หลายแบบครับ เพราะการส่งข้อมูลข้ามฟอร์มมีหลายแบบ เช่น จากฟอร์มลูกสู่ฟอร์มแม่ (ซึ่งทำแบบที่คุณ picharnan ว่ามาแบบนั้นก็ได้ครับ ใส่ Public ให้มันซะ ) กับอีกแบบคือ จากฟอร์มลูกสู่ฟอร์มลูก (อันนี้มันส์เลยครับ  Tongue เช่น คลิกปุ่มจากฟอร์มลูกอันแรก แล้วข้อมูลไปเด้งขึ้นอีกฟอร์มลูก อันนี้อาจจะใช้เมธอดบนฟอร์มแม่เป็น Public แล้วเรียกบนฟอร์มแม่ ) เป็นต้น ส่วนฟอร์มแม่สู่ฟอร์มลูก อันนี้ง่ายอยู่แล้วครับ  Tongue

เดี๋ยวจะลองเอาโค้ดตัวอย่างมาให้ดูนะครับ
บันทึกการเข้า


picharnan
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 90
ออฟไลน์ ออฟไลน์

กระทู้: 1,400



ดูรายละเอียด
« ตอบ #4 เมื่อ: 12 กุมภาพันธ์ 2011, 15:51:51 »

ขอบคุณคุณ kenessar มากครับ  +1  ให้ครับ
บันทึกการเข้า
kenessar
ก๊วนเสียว
*

พลังน้ำใจ: 34
ออฟไลน์ ออฟไลน์

กระทู้: 342



ดูรายละเอียด เว็บไซต์
« ตอบ #5 เมื่อ: 12 กุมภาพันธ์ 2011, 16:21:06 »

กรณีการส่งข้อมูลผ่านฟอร์ม โดยใช้อีเว้นท์

ถ้าเราอยากจะได้การส่งข้อมูลที่ง่าย และรวดเร็ว ส่งผ่านฟอร์มใดๆก็ได้อย่างอิสระ ไม่ต้องยุ่งกับเรื่อง Modifier ของ Properties แนะนำให้สร้างอีเว้นท์ขึ้นมาเองครับ สร้างครั้งเดียว แล้วเอาไปใช้กับงานหน้าได้ด้วย

ทำตามสเต็ปนี้ครับ
1. สร้างดีลีเกตและอีเว้นท์ขึ้นมารองรับการส่งข้อมูลข้ามฟอร์ม
2. ผูกอีเว้นท์เข้ากับเมธอด บน Source code ของฟอร์มแม่
3. ฟอร์มไหนจะส่งข้อมูลผ่านอีเว้นท์ ก็เรียกอีเว้นนั้น พร้อมส่งข้อมูลผ่านอาร์กิวเม้นท์ไป

1. สร้างดีลีเกตและอีเว้นท์ขึ้นมารองรับการส่งข้อมูลข้ามฟอร์ม

อันนี้เราจะสร้างดีลีเกต ที่สามารถส่งพารามิเตอร์ไปกี่ตัวก็ได้นะครับ จะยืดหยุ่นมาก เพราะฟอร์มลูกแต่ละตัว อาจจะส่งข้อมูลไปให้ฟอร์มแม่ หรือ ฟอร์มลูกตัวอื่นไม่เท่ากัน ไปดูกันเลย

ผมจะสร้างไฟล์ขึ้นมาอันนึงแล้ว สร้างคลาสขึ้นมาอันนึงเพื่อทำเป็น EventArgument ในแบบของเราเอง

โค๊ด:
public class ParamEventArgs : EventArgs
{
private List<Object> paramList;

public List<Object> Params
{
return paramList;
}

public ParamEventArgs()
{
this.paramList = new List<Object>();
}

public ParamEventArgs(List<Object> paramList)
{
this.paramList = paramList;
}
}

และก็สร้างดีลีเกตที่มีรูปแบบเหมาะสมสำหรับส่งข้อมูลข้ามฟอร์มมารองรับ

โค๊ด:
public delegate void OnChildFormSendingData(object sender, ParamEventArgs e);

แล้วก็เซฟไฟล์ครับ

ทีนี้มาดูในฟอร์มลูก เราก็ประกาศอีเว้นท์ให้มันก่อน เอาเป็นชื่อ OnSendingData ละกัน

โค๊ด:
public event OnChildFormSendingData OnSendingData;

พอถึงตรงที่จะให้มันส่งข้อมูลก็เรียกอีเว้นท์นี้ขึ้นมา สมมุตถ้า Button1 ถูกคลิกละกัน ผมก็จะเอาข้อมูลใส่ใน ParamEventArgs เพื่อที่จะส่งไป จะมีกี่ตัวก็ยัดไปเลยครับ

โค๊ด:
private void Button1_Click(object sender, EventArgs e)
{
    List<Object> paramList = new  List<Object>();
    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 ก็ได้ครับผม  wanwan019
« แก้ไขครั้งสุดท้าย: 12 กุมภาพันธ์ 2011, 16:24:05 โดย kenessar » บันทึกการเข้า


kenessar
ก๊วนเสียว
*

พลังน้ำใจ: 34
ออฟไลน์ ออฟไลน์

กระทู้: 342



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 12 กุมภาพันธ์ 2011, 16:26:00 »

หากเข้าใจวิธีการผูกอีเว้นเข้ากับเมธอดและนำไปประยุกษ์ใช้ได้ จะเกิดประโยชน์มากครับ เพราะนอกจากจะเซ็ตพร็อบเพอร์ตี้ได้แล้ว เรายังแทรกโค้ดอื่นๆได้อีกมากมายครับ

อ่อ ตรง Child1.OnSendingData  = new OnChildFormSendingData(Child4.myChild4Method);

มันต้องมีเครื่องหมายบวกด้วยนะครับ

     Child1.OnSendingData   += new OnChildFormSendingData(Child4.myChild4Method);

มันไม่ให้ผมใส่ T_T
« แก้ไขครั้งสุดท้าย: 12 กุมภาพันธ์ 2011, 16:27:11 โดย kenessar » บันทึกการเข้า


picharnan
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 90
ออฟไลน์ ออฟไลน์

กระทู้: 1,400



ดูรายละเอียด
« ตอบ #7 เมื่อ: 12 กุมภาพันธ์ 2011, 16:54:13 »

ขอบคุณมากครับ  ผมจะนำไปประยุกต์ใช้ต่อไปครับ  ^____________^  คาราวะ 1 จอก
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
พิมพ์