เรียก object บน form หลัก

Go down

เรียก object บน form หลัก

ตั้งหัวข้อ  Platoo on 11th May 2010, 8:56 am

สวัสดีครับคุณลาภลอยฯ

ขอรบกวนนิดครับ คิดว่าคุณคงพอจะช่วยได้ ขอเล่าคร่าวๆนะครับ คือมีการ 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

ดูข้อมูลส่วนตัว

ขึ้นไปข้างบน Go down

ส่งค่าอ้างอิงให้

ตั้งหัวข้อ  Admin on 12th May 2010, 1:30 pm

สวัสดีครับคุณปลาทู

ปัญหาที่คุณว่ามาเกิดจากออพเจ็กต์ผู้ให้บริการ (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 ครั้ง

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

นี่ไงเล่าเคล็ดลับ

ตั้งหัวข้อ  Admin on 12th May 2010, 2:16 pm



บรรทัดที่ 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 ก็จะเห็นหมดทุกตัว

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

ยังติดปัญหาอีกเล็กน้อย

ตั้งหัวข้อ  Admin on 18th May 2010, 9:42 pm

เรียนคุณลาภลอยฯ

ขอบคุณมากครับสำหรับคำแนะนำ แต่ผมยังติดปัญหาอีกเล็กน้อย คือ ไม่สามารถเรียกใช้ 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

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

าตอนสร้างออพเจ็กต์

ตั้งหัวข้อ  Admin on 18th May 2010, 9:44 pm

ให้ส่งค่าตอนสร้างออพเจ็กต์แทนที่จะรับค่าตอนคลิกครับ

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

ขึ้นไปข้างบน


 
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ