เรียก object บน form หลัก
2 posters
หน้า 1 จาก 1
เรียก object บน form หลัก
สวัสดีครับคุณลาภลอยฯ
ขอรบกวนนิดครับ คิดว่าคุณคงพอจะช่วยได้ ขอเล่าคร่าวๆนะครับ คือมีการ request ให้ช่วยสร้าง report เพิ่มเติมจาก Application เดิม ก็เลยสร้างเป็น Single form ซึ่งเป็นการติดต่อฐานข้อมูลแบบ Client - Server โดยสร้าง connection object ไว้ใน form แล้วส่ง query เพื่อเรียกหาข้อมูล
ต่อมาก็มีการขอเพิ่มขึ้นมาอีก แต่จาก user คนละกลุ่ม ก็เลยใช้วิธี copy ของเดิมแล้วแปลงเอา อย่างว่าละครับ ในที่สุดก็มีการขอเพิ่มมาเรื่อยๆทั้งกลุ่มเดิมและกลุ่มใหม่ ผมเลยคิดว่า เพื่อเป็นการลด overhead ในการ connection จึงน่าที่จะปรับปรุงให้เป็นแบบ Multi-form คือ เป็นแบบ main form แล้วเรียก sub form ตามลักษณะของ Report จะดีกว่า
แต่เมื่อพยายามรวมเข้าด้วยกัน โดยให้ Main form เป็นตัวสร้าง connection oblect เพียงตัวเดียว แล้วให้ sub form ตัวอื่นเรียกใช้ object นี้เพื่อส่ง query ตามลักษณะของแต่ละ Report ปรากฏว่า sub form มองไม่เห็น connection object แม้ว่าจะกำหนดให้เป็น pulic บน main form แล้วก็ตาม
คือเท่าที่พยายามค้นหาจากบทความต่างๆมักจะเป็นแบบ main form เรียกหา object บน sub form แต่ในกรณีผมจะกลับกัน คือ sub form เรียกหา object บน main form
ขอบคุณครับ
ขอรบกวนนิดครับ คิดว่าคุณคงพอจะช่วยได้ ขอเล่าคร่าวๆนะครับ คือมีการ request ให้ช่วยสร้าง report เพิ่มเติมจาก Application เดิม ก็เลยสร้างเป็น Single form ซึ่งเป็นการติดต่อฐานข้อมูลแบบ Client - Server โดยสร้าง connection object ไว้ใน form แล้วส่ง query เพื่อเรียกหาข้อมูล
ต่อมาก็มีการขอเพิ่มขึ้นมาอีก แต่จาก user คนละกลุ่ม ก็เลยใช้วิธี copy ของเดิมแล้วแปลงเอา อย่างว่าละครับ ในที่สุดก็มีการขอเพิ่มมาเรื่อยๆทั้งกลุ่มเดิมและกลุ่มใหม่ ผมเลยคิดว่า เพื่อเป็นการลด overhead ในการ connection จึงน่าที่จะปรับปรุงให้เป็นแบบ Multi-form คือ เป็นแบบ main form แล้วเรียก sub form ตามลักษณะของ Report จะดีกว่า
แต่เมื่อพยายามรวมเข้าด้วยกัน โดยให้ Main form เป็นตัวสร้าง connection oblect เพียงตัวเดียว แล้วให้ sub form ตัวอื่นเรียกใช้ object นี้เพื่อส่ง query ตามลักษณะของแต่ละ Report ปรากฏว่า sub form มองไม่เห็น connection object แม้ว่าจะกำหนดให้เป็น pulic บน main form แล้วก็ตาม
คือเท่าที่พยายามค้นหาจากบทความต่างๆมักจะเป็นแบบ main form เรียกหา object บน sub form แต่ในกรณีผมจะกลับกัน คือ sub form เรียกหา object บน main form
ขอบคุณครับ
Platoo- จำนวนข้อความ : 1
Join date : 06/05/2010
ส่งค่าอ้างอิงให้
สวัสดีครับคุณปลาทู
ปัญหาที่คุณว่ามาเกิดจากออพเจ็กต์ผู้ให้บริการ (server object ที่คุณเรียกว่า sub form) มองไม่เป็นสมาชิกของออพเจ็กต์ผู้เรียกใช้บริการ (client object ที่คุณเรียกว่า main form) ซึ่งเป็นเรื่องปรกติ
เพราะออพเจ็กต์ใดๆ ย่อมไม่มีทางรู้ว่าตัวมันถูกสร้างขี้นโดยออพเจ็กต์ใด
พูดอีกอย่างหนึ่งคือ sub form ไม่มีทางรู้ว่า main form คือผู้ที่สร้างม้ัน จึงอ้างถึงสมาิชิกต่างๆ ของ main form ไม่ได้
วิธีแก้คือให้ main form ส่งค่าอ้างอิงของตัวมันให้แก่ sub form ตอนที่มันสร้าง sub form
การทำแบบนี้เหมือนการส่งพอยน์เตอร์ หรือแฮนเดิลในภาษา C/C++
ค่าอ้างอิงนี้มีไว้เพื่อทำหน้าที่ให้ sub from อ้างกลับมายัง main form ได้
พูดอีกอย่างหนึ่งคือ ตัวอ้างอิงมีไว้เพื่อให้ออพเจ็กต์ผู้ให้บริการ สามารถอ้างอิงกลับไปยังออพเจ็กต์ผู้เรียกใช้บริการได้
งงไหม??
ถ้างงให้ดูตัวอย่างโค้ดต่อไปนี้
ปัญหาที่คุณว่ามาเกิดจากออพเจ็กต์ผู้ให้บริการ (server object ที่คุณเรียกว่า sub form) มองไม่เป็นสมาชิกของออพเจ็กต์ผู้เรียกใช้บริการ (client object ที่คุณเรียกว่า main form) ซึ่งเป็นเรื่องปรกติ
เพราะออพเจ็กต์ใดๆ ย่อมไม่มีทางรู้ว่าตัวมันถูกสร้างขี้นโดยออพเจ็กต์ใด
พูดอีกอย่างหนึ่งคือ sub form ไม่มีทางรู้ว่า main form คือผู้ที่สร้างม้ัน จึงอ้างถึงสมาิชิกต่างๆ ของ main form ไม่ได้
วิธีแก้คือให้ main form ส่งค่าอ้างอิงของตัวมันให้แก่ sub form ตอนที่มันสร้าง sub form
การทำแบบนี้เหมือนการส่งพอยน์เตอร์ หรือแฮนเดิลในภาษา C/C++
ค่าอ้างอิงนี้มีไว้เพื่อทำหน้าที่ให้ sub from อ้างกลับมายัง main form ได้
พูดอีกอย่างหนึ่งคือ ตัวอ้างอิงมีไว้เพื่อให้ออพเจ็กต์ผู้ให้บริการ สามารถอ้างอิงกลับไปยังออพเจ็กต์ผู้เรียกใช้บริการได้
งงไหม??
ถ้างงให้ดูตัวอย่างโค้ดต่อไปนี้
แก้ไขล่าสุดโดย Admin เมื่อ 12th May 2010, 2:34 pm, ทั้งหมด 3 ครั้ง
นี่ไงเล่าเคล็ดลับ
บรรทัดที่ 8 ถึง 15 คือคลาส MainForm ทำหน้าที่เป็นตัวอย่างแทน main form ของคุณ
บรรทัดที่ 16 ถึง 22 คือคลาส SubForm ทำหน้าที่เป็นตัวอย่างแทน sub form ของคุณ
โปรดสังเกตบรรทัดที่ 18 คุณจะเห็นว่าผมได้ทำโอเวอร์โหลด ต่อคอนสทรักเตอร์ของคลาสนี้ เพราะนี่คือนิยามคอนสทรักเตอร์แบบมีพารามิเตอร์หนึ่งตัว (แม้ว่าผมไม่ได้นิยามดีฟอลคอนสทร้ักเตอร์ไว้ แต่ตัวแปลภาษา C# จะลอบสร้างให้ตอนคอมไพล์อยู่ดี)
โปรดสังเกตต่อไปอีกว่า คอนสทรักเตอร์แบบมีพารามิเตอร์ที่ว่านี้ มีชนิดข้อมูลของพารามิเตอร์เป็นไทป์ของคลาส main form เลยทีเดียว นี่ไงเล่าเคล็ดลับที่ทำให้คุณสามารถส่งค่าอ้างอิงของ main form มาให้ sub form ได้
ถ้าไม่อยากทำคอนสทรักเตอร์โอเวอร์โหลด คุณจะส่งค่าอ้างอิง this ผ่านเมธอดธรรมดาก็ได้ หรือจะส่งโดยใ้ช้พรอพเพอร์ตีได้อีกเหมือกัน
ต่อไปดูบรรทัดที่ 13 นี่คือโค้ดที่สร้างออพเจ็กต์ sub form และส่งค่าอ้างอิงตัว main form (คือ this) ไปให้ด้วยพร้อมๆ กัน
สุดท้ายดูบรรทัดที่ 20 จะเห็นว่า sub form มองเห็น (สามารถอ้างถึง) สมาิชิกขื่อ foo main form ได้
ถ้าหากว่า foo คือ connection object ของคุณ ปัญหาของคุณก็จบแล้ว
ในตัวอย่างนี้ main form มีสมาชิกเพียงตัวเดียว ถ้ามีมากกว่านี้ sub form ก็จะเห็นหมดทุกตัว
ยังติดปัญหาอีกเล็กน้อย
เรียนคุณลาภลอยฯ
ขอบคุณมากครับสำหรับคำแนะนำ แต่ผมยังติดปัญหาอีกเล็กน้อย คือ ไม่สามารถเรียกใช้ object บน Main Form ผ่าน object บน sub form
คือ เป็นอย่างนี้ครับ การทำงานของ sub form จะเกิดขึ้นเมื่อ มีการกดปุ่ม ผมพบว่า จะต้องมีการผ่านพารามิเตอร์ของคลาส main form ไปให้ด้วยเพื่อผ่านไปยังฟังชั่นอีกทีหนึ่ง
ของเดิม
private void btnRun_Click(object sender, EventArgs e)
{
ReadData();
}
พบว่าจะต้องทำการเพิ่มพารามิเตอร์ของคลาส main form
private void btnRun_Click(object sender, EventArgs e, MainFrm m)
{
ReadData(m);
}
จึงจะทำให้ฟังชั่น ReadData ใช้ object ของ main Form ได้ แต่เมื่อ compile ปรากฏ error ดังนี้
this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
No overload for 'btnRun_Click' matches delegate 'System.EventHandler'
จะต้องทำการ overload อย่างไรครับ หวังว่าคงไม่เป็นการรบกวนจนเกินไปนะครับ
Platoo.
Platoo
จำนวนข้อความ: 2
Join date: 06/05/2010
ขอบคุณมากครับสำหรับคำแนะนำ แต่ผมยังติดปัญหาอีกเล็กน้อย คือ ไม่สามารถเรียกใช้ object บน Main Form ผ่าน object บน sub form
คือ เป็นอย่างนี้ครับ การทำงานของ sub form จะเกิดขึ้นเมื่อ มีการกดปุ่ม ผมพบว่า จะต้องมีการผ่านพารามิเตอร์ของคลาส main form ไปให้ด้วยเพื่อผ่านไปยังฟังชั่นอีกทีหนึ่ง
ของเดิม
private void btnRun_Click(object sender, EventArgs e)
{
ReadData();
}
พบว่าจะต้องทำการเพิ่มพารามิเตอร์ของคลาส main form
private void btnRun_Click(object sender, EventArgs e, MainFrm m)
{
ReadData(m);
}
จึงจะทำให้ฟังชั่น ReadData ใช้ object ของ main Form ได้ แต่เมื่อ compile ปรากฏ error ดังนี้
this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
No overload for 'btnRun_Click' matches delegate 'System.EventHandler'
จะต้องทำการ overload อย่างไรครับ หวังว่าคงไม่เป็นการรบกวนจนเกินไปนะครับ
Platoo.
Platoo
จำนวนข้อความ: 2
Join date: 06/05/2010
Similar topics
» ต้องการดึงค่าตัวแปรจาก Form main มาใช้ใน Form ลูก
» สอบถามการใช้คำสั่งข้าม form บน windowapplication ด้วย C#
» สอบถามการใช้คำสั่งข้าม form บน windowapplication ด้วย C#
หน้า 1 จาก 1
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ
|
|