เลือกข้อมูลมากกว่า 1 ข้อเก็บไว้ใน Text Box
กระทู้เก่าบอร์ด อ.Yeadram

 2,336   5
URL.หัวข้อ / URL
เลือกข้อมูลมากกว่า 1 ข้อเก็บไว้ใน Text Box

      สวัสดีครับขอคำแนะนำครับ
      เลือกข้อมูลจาก Option Group หรือจาก Check Box มากกว่า 1 ข้อแล้วให้แต่ละข้อที่ถูกเลือกนั้นมาเก็บไว้ใน Text Box ซึ่งเก็บข้อมูลเป็นชนิด Memo ข้อมูลที่มีให้เลือกมีประมาณนี้
1.A       2.B        3.C       4.D       5.E
6.F       7.G        8.H        9.I       10.J
11.K     12.L      13 M     14.N      15O
ถ้าเราคลิกเลือกข้อ 2.B 5.E   8.H 10.J แล้วให้ข้อมูลที่เลือกไว้ทั้งหมด 4 รายการมาเก็บค่าไว้ใน Text Box สมมติเป็น Text1 ก็ให้เก็บข้อมูลเป็นแบบนี้เลย
        2.B    5.E
        8.H   10.O
พอจะมีแนวทางแนะนำบ้างไหมครับ ขอบคุณครับ

5 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R06580
ใช้ control array ร่วมกับการวนลูป for .. each .. next ครับ

dim ctl as control 'ประกาศตัวแปรออบเจค
dim sq as string ' ประกาศตัวแปรเตรียมต่อสายอักขระ
sq =""   ' เตรียมสายอักขระ ก่อนเข้าลูป

for each ctl in controls
- ระบุเงื่อนไขเข้าไป เพื่อให้โค้ดทำงานได้ง่าย เร็ว และเสถียร--
เช่น
if left(ctl.name, 3)= "chk" then ' ให้โค้ดมองหาเฉพาะคอนโทรลที่มีชื่อขึ้นต้นด้วย chk
หรือ
if typeof ctl is Checkbox then   ' ให้โค้ดมองหาเฉพาะคอนโทรลที่เป็น check box

' เมื่อคิดว่ารัดกุมพอสมควรแล้วค่อย ตรวจสอบเงื่อนไขสุดท้าย
' นั่นคือดูว่า คอนโทรลตัวนั้นได้ถูกติ๊ก หรือไม่ แล้วนำค่ามาต่อสายอักขระ
if me(ctl.name).value=true then
sq = sq & me(ctl.name).caption ' เอาตัวหนังสือประจำคอนโทรลนั้นๆ มาต่อสายอักขระ

next

เมื่อจบลูป เราก็จะได้สายอักขระ มา 1 ชุดค่อยเอาไปใส่ textbox ที่ต้องการ
me.textbox = sq
2 @R06593
ตัวอย่างไม่มีครับ \

คำถามย้อน
checkbox ของคุณบนฟอร์มมีกี่ตัว
checkbox แต่ละตัวของคุณ ตั้งชื่อว่าอะไรบ้าง
checkbox แต่ละตัวของคุณ มีค่าประจำตัวแตกต่างกันอย่างไร (จะเอาค่าอะไรไปใส่ใน Memo, เอาตัวหนังสือจากตรงไหน)
ที่คุณลองพยายามทำตามแล้วไม่ได้ คุณได้ลองอย่างไร

เตรียมตัวทำแบบฝึกหัด
ลองทำตามดังนี้
สร้างฟอร์มเปล่าๆ ไม่มีแหล่งข้อมูลมา 1 ฟอร์ม
มี 1 ปุ่มคำสั่ง       cmdSave
มี 1 textbox        txMemo
มี 5 checkbox     chk01, chk02, chk03, chk04, chk05
แต่ละ checkbox มี label เป็นของตัวเอง ตั้งชื่อสัมพันธ์กับตัว checkbox ดังนี้
                           lb_chk01, lb_chk02, lb_chk03, lb_chk04, lb_chk05
lb_chk01   เขียนคำอธิบาย (caption) ว่า    A
lb_chk02   เขียนคำอธิบาย (caption) ว่า    B
lb_chk03   เขียนคำอธิบาย (caption) ว่า    C
lb_chk04   เขียนคำอธิบาย (caption) ว่า    D
lb_chk05   เขียนคำอธิบาย (caption) ว่า    E

อธิบาย แบบฝึกหัด
การใช้ control array คือหลักการตั้งชื่อคอนโทรลให้อยู่ในรูปแบบเดียวกัน เสมือนการกำหนดใช้คอนโทรลเหล่านั้นเป็นสมาชิกของอาเรย์ โดยอัตโนมัติ
ในตัวอย่างนี้ ถ้าคุณลองสังเกตดีๆ คุณจะมองเห็นมันและสามารถนำมันไปประยุกต์เป็น อาเรย์ตั้งหลายกลุ่ม เช่น
1) จำนวนคอนโทรลทุกชนิดที่อยู่บนฟอร์ม (มีสมาชิก 13 ตัว)
2) จำนวนคอนโทรลที่เป็นชนิด checkbox (มีสมาชิก 5 ตัว)
3) จำนวนคอนโทรลที่มีชื่อขึ้นต้นด้วยคำว่า chk (มีสมาชิก 5 ตัว)
4) จำนวนคอนโทรลที่เป็น label (มีสมาชิก 6 ตัว)
5) จำนวนคอนโทรลที่มีชื่อขึ้นต้นด้วย lb_chk (มีสมาชิก 5 ตัว)
6) จำนวนคอนโทรลที่มี คำว่า chk อยู่ในชื่อ (มีสมาชิก 10 ตัว)
        เห็นไหมครับ ว่าเรามี อาเรย์ให้ใช้ตั้งเยอะแยะหลายกลุ่ม แล้วแต่ว่าเราจะประยุกต์ใช้อย่างไรล่ะทีนี้

แบบฝึกหัด (ต่อ)
เขียนโค้ดในปุ่มคำสั่งดังนี้
Private sub cmdSave_Click()
dim mMemo as string
dim nm as string
dim ctl as control

'เตรียมสายอักขระเอาไว้ต่อ
mMemo="start"    ' อ่ะ มีลูกไม้มวยไทย ไว้นิดนึง

for each ctl in controls ' ใช้อาเรย์ที่เป็น คอนโทรลทั้งหมด

' ตรวจสอบเงื่อนไข เพื่อมองหาเฉพาะ checkbox ที่ถูกติ๊กเท่านั้น
if typeof ctl is checkbox and me(ctl.name).value=true then

' เพื่อหา label ที่คู่กับมันต้องดูที่ความสัมพันธ์ของชื่อมัน
nm=right(ctl.name,2) ' ดูเลขท้ายของชื่อ checkbox

' เอาค่า caption ของ label ที่มีชื่อลงท้ายเหมือนกัน มาต่อสายอักขระ
mMemo = mMemo & ", " & me("lb_chk" & nm).caption ' มีลูกไม้มวยไทยแถม ในแต่ละรอบ

End if

Next

' เมื่อจบลูป เราก็จะได้สายอักขระมา 1 ชุด เอาไปใส่ textbox ได้เลย
me.txMemo = replace(mMemo,"start, ","") ' พร้อมกับการแก้ลูกไม้มวย

End sub

    
3 @R06625
" มี bug ที่บรรทัดนี้ครับ If TypeOf ctl Is CheckBox And Me(ctl.Name).Value = True Then "

ผมลองแก้ตรงบรรทัดนี้ใหม่เป็น
If TypeOf ctl Is CheckBox = True Then
Me(ctl.Name).Value = True


บรรทัดแรกผิดมหันต์ is checkbox = true
บรรทัดที่สองก็ผิดเพราะที่คุณเขียน เป็นการสั่งให้มันกระทำ
แต่ในเจตนาของผมคือ ต้องการตรวจสอบค่าของมันเท่านั้น ไม่ได้สั่งให้มันกระทำ

ดังนั้น ให้ลองแก้เป็น

If TypeOf ctl Is CheckBox Then ' ตรวจหาคอนโทรลที่เป็น checkbox เท่านั้น
IF Me(ctl.Name).Value = True THEN ' มองหาตัวที่มีชื่อขึ้นต้นด้วย chk เท่านั้น
' หรือ IF left(ctl.name,3)="chk" and Me(ctl.Name).Value = True THEN   ' มองหาตัวที่มีชื่อขึ้นต้นด้วย chk ที่ถูกติ๊กเท่านั้น
nm=right(ctl.name,2)
mMemo = mMemo & ", " & me("lb_chk" & nm).caption
END IF
end if
next

4 @R06627
เอาตามแบบคุณก็ได้ครับ จะไม่ต้องสับสนอีก

ก่อนเข้าลูปไม่ต้องมี string ใดๆ เลย (mMemo="")
แต่ตอนจบลูป (หลัง next) ต้องมาขัดเกลามันนิดหน่อย
me.txMemo = iif(mMemo<>"",left(mMemo,len(mMemo)-1),"")
หรือจะเขียนให้มันเข้าใจง่ายๆ ก็

if mMemo<>"" then
   txMemo=left(mMemo,len(mMemo)-1) ' ตัดอักขระตัวสุดท้ายออก 1ตัว
else
   txMemo=mMemo
end if
5 @R16534
ดิฉันลองทำตามดูแร้วนะคะ
มันติ๊กให้ทุกช่องเลยค่ะ
ต้องแก้ไขตรงไหนรึป่าวคะ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2621s