กระทู้เก่าบอร์ด อ.Yeadram
2,401 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
พอจะมีแนวทางแนะนำบ้างไหมครับ ขอบคุณครับ
เลือกข้อมูลจาก 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
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
คำถามย้อน
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
บรรทัดแรกผิดมหันต์ 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
" มี 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
ก่อนเข้าลูปไม่ต้องมี 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
ดิฉันลองทำตามดูแร้วนะคะ
มันติ๊กให้ทุกช่องเลยค่ะ
ต้องแก้ไขตรงไหนรึป่าวคะ
มันติ๊กให้ทุกช่องเลยค่ะ
ต้องแก้ไขตรงไหนรึป่าวคะ
Time: 0.3043s
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