ตรวจสอบก่อนจะ Focus Textbox ยังไงครับ
กระทู้เก่าบอร์ด อ.Yeadram

 4,668   10
URL.หัวข้อ / URL
ตรวจสอบก่อนจะ Focus Textbox ยังไงครับ

ผมมี TextBox อยู่ 2 ตัว
ตัวแรกผมสั่งว่า me.txt1.Enabled = False
ตัวสองผมสั่งตรง txt2_gotfocus()
if me.txt1.value = "" then
     me.txt1.enabled = true
     me.txt1.setfocus
end if

อธิบายอีกทีนะครับ
คือถ้าข้อมูลของ Txt1 ว่างเปล่า ก็ให้เปิดให้ Txt1 enabled แล้วก็ไป SetFocus ที่ผมเข้าใจคือผมไปดักที่ GotFocus (หรือ onEnter) ปรากฎว่าขึ้น Error ว่า Run-time error '2110';
microsoft Access can't move the focus to the control Txt2

ผมต้องแก้ไขยังไงครับ

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

1 @R07100
ตอบไม่ได้ เพราะอ่านแล้วไม่เข้าใจ
2 @R07101
เอาใหม่ละกันครับ

คือสมมุติ ปัจจุบัน Focus อยู่ที่ Txt 2 พอผมกด Enter หรือ Tab มันก็จะ Setfocus ไปยัง Txt3 ใช่ไหมครับ แต่ผมต้องการ Check ก่อนที่จะ setfocus ไปยัง Txt3 ว่าถ้า Txt1 มีค่าว่างเปล่าให้ไปที่ Txt1 ก่อนอ่ะครับ
ผมเลยไปดักที่ Txt3 ตรง Gotfocus ว่า
if me.txt1.value = "" then
     me.txt1.setfocus
end if
ปรากฎว่าขึ้น Error ว่า Run-time error '2110';
microsoft Access can't move the focus to the control Txt2

เหมือนว่าตัวมันเองกำลังจะไป Focus ที่ Txt3 อยู่แล้วดันไปสั่งให้ไป Focus ที่ Txt1 อีก เลย Error หรือเปล่าครับ
ไม่รู้จะทำยังไงเหมือนกัน
อันนี้ไม่รู้คุณ U&ME อ่านแล้วเข้าใจไหมครับ
3 @R07103
ถ้าทำตามกระทู้ (R07094) แล้ว กระทู้ R07101 ก็ไม่มีปัญหา
4 @R07106
เอานี่ไปด้วยเลยครับ

สมมติว่ามี TextBox 2 อัน (Text0,Text2)

Private Sub Text2_GotFocus()
If IsNull(Text0) Then
      Text0.SetFocus
End If
End Sub
5 @R07143
ขอโทษครับ ถามต่อนะครับ ที่ Text2_Gotfous นะครับ

ถ้าที่ Text3_click ผมสั่งว่า text2.setfocus แล้วปรากฎว่าค่าของ isnull(text0) = True มันก็จะต้อง Setfocus ไปที่ Text0 ถูกต้องไหมครับ

ทีนี้ปรากฏว่ามันฟ้อง Error ว่า Run-time error '2110';
microsoft Access can't move the focus to the control Text2
แต่ถ้าค่า isnull(text0) = false ไม่เป็นไรครับ

ยังงี้ต้องแก้ไขตรงไหนครับ คิดไม่ออก

6 @R07144
ตามกระทู้ R07094 มันเหมาะที่จะใช้เช็ค Textbox หลาย ๆ อัน เราไม่ต้องเขียนโค้ด
GotFocus, LostFocus หลาย ๆ ที่ (ทำให้สับสน...)

กรณี 1 ถ้ามี TextBox หลายอัน
     ซึ่งแต่ละอันคุณกำหนดให้ต้องป้อนข้อมูล โค้ดจาก กท.R07094 จะทำการเช็คตั้งแต่ TextBox(1) - TextBox(n) เมื่อเช็คแล้วถ้ายังมี TextBox บางตัวยังไม่มีข้อมูล ก็จะทำการ SetFocus ไปที่ TextBox นั้นเพื่อให้ผู้ใช้้ป้อนข้อมูล
     เมื่อเป็นอย่างนั้นแล้ว เราก็แค่สร้างปุ่มเพือให้ผู้ใ้ช้กดเพียงปุ่มเดียว
เพื่อบันทึกข้อมูล

กรณี 2 ถ้ามี TextBox แค่ 2 อัน (สมมติ Text0,Text1)
   ถ้าต้องการเช็คแค่ว่า Text0 มีข้อมูลหรือไม่ โดยการใช้เหตุการณ์ Text1_GotFocus ก็ให้ใช้โค้ด

Private Sub Text1_GotFocus()
If IsNull(Text0) Then
      Text0.SetFocus
End If
End Sub

***หมายเหตุ
     ผมเองก็ยังคงไม่เข้าใจคำถามมากนัก ยังไงเอาโค้ด Module นั้นมาให้ดูเลยก็ได้คับ
7 @R07145
ไม่เข้าใจว่าทำไมต้องสั่ง Enable-Disable ถ้าต้องการบังคับให้ใส่ค่า Text ใดก่อนจึงจะยอมให้อีก Text หนึ่งรับค่าได้ก็ทำง่ายๆครับ

txt2_gotfocus() แนะนำว่าเป็น on Enter() ดีกว่า
if isnull(txt1)=True or txt1="" then
   txt1.gotfocus
end if

แต่ถ้าต้องการตรวจสอบในขั้นสุดท้ายทีเดียวว่ามี Textbox ใดว่างที่ยังไม่ใส่ค่าก็ใช้วิธีนี้ครับ สร้าง Sub ขึ้นมาเองเลยอย่างนี้ครับ

Private Sub Checkdata()

For Each Ctrl In Me.Section(acDetail).Controls
            If Ctrl.ControlType = acTextBox Then
               If IsNull(Ctrl.Value) = True Or Ctrl.Value = "" Then
                    Ctrl.SetFocus
                    MsgBox "อยากใส่อะไรก็ว่าไป"
                    
                    Exit Sub
               End If
            End If
        Next Ctrl

End sub
ตรงบรรทัด For Each Ctrl In Me.Section(acDetail).Controls
หมายถึงตรวจสอบเฉพาะ Control ที่อยู่ใน Section Detail (ไม่ใช่ Header หรือ Footer ของฟอร์ม)
If Ctrl.ControlType = acTextBox Then
หมายถึงตรวจสอบเฉพาะ Control ที่เป็น Textbox เท่านั้น
8 @R07147
เอาใหม่เลยนะครับ

ผมมีtextbox แบบนี้ ทั้งหมด 4 ตัว

--------------------------------------------------------------------
รหัสสินค้า      จำนวน   ราคา    มูลค่าเงิน
--------------------------------------------------------------------
[                   ]   [        ] [          ]   [               ]

case ที่ 1 ข้อมูลที่ได้มามีรหัสสินค้าอยู่แล้ว
[A-001]             [ 10    ] [ 100    ]   [    1000 ]
ถ้าเราไป click ที่ช่องจำนวนก็จะไม่มีปัญหาอะไร

case ที่ 2 ยังไม่ได้ระบุรหัสสินค้า แต่เราอาจจะเผลอไป Click ที่ ช่องจำนวน หรือช่องราคา ฯลฯ ผมอยากจะบังคับให้ไป Focus ที่รหัสสินค้าก่อน ผมก็ใส่ code แบบที่บอกนะครับ แต่ไงมันดันขึ้น error 2110 ไม่รู้
9 @R07148
ลืมบอก code ที่ใส่
sub txt2_gotfocus
if txt1.value <> "" then
   txt1.setfocus
endif

sub txt3_gotfocus
if txt1.value <> "" then
txt1.setfocus
endif

sub command1_click
txt2.setfocus
endsub

* หมายเหตุ ปัญหามันเกิดตอนที่ผมกดปุ่ม command1_click นะครับ และข้อมูลที่ได้มาเป็นแบบ case ที่ 2 (ลืมบอก) เหมือนประมาณว่า มันกำลังจะถูกสั่งให้มา focus ที่ txt2 แต่โดนบังคับให้ไป focus อีกที ที่ txt1 มันเลย error หรือเปล่าครับ
10 @R07150
จากโค้ด กท.R07148 เมื่อ Command1_Click ทำงาน โปรแกรมจะสูญเสียการควบคุมเมื่อทำงานที่กระบวนการ txt2_GotFocus เสร็จสิ้น

ตัวอย่างเช่น (สมมติมี Text1, Text2, Text3, Command1)
     ถ้าต้องการ SetFocus ไปที่ Text2,Text3 แ้้ล้วทำการตรวจสอบข้อมูล เมื่อกด Command1
---------------------------------------------1
Private Sub Command1_Click()
     Text2.SetFocus
End sub

Private Sub Text2_GotFocus()
     Text3.SetFocus
End sub

Private Sub Text3_GotFocus()
     If isnull(Text1) then
           Text1.SetFocus
     End If
End sub
---------------------------------------------2
แทนที่จะเขียนคำสั่งที่ถูกต้องดังนี้
Private Sub Command1_Click()
     Text2.SetFocus
     Text3.SetFocus
     If isnull(Text1) then
          Text1.SetFocus
     End If
End sub

***หมายเหตุ
     ถ้ามองดูเผิน ๆ หรือคิดอย่างที่คนเราเข้าใจ มันก็ไม่น่าจะผิด
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3294s