www.oocities.org/pontipa001

หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer

 การใช้งานDBGrid

หัวข้อนี้จะแนะนำการใช้ DBGrid การใช้ DBGrid นั้นไม่ค่อยมีหนังสือกล่าวถึงรายละเอียดมากนัก แม้กระทั่งหนังสือจากต่างประเทศกล่าวน้อยมาก   ส่วนใหญ่มักจะเขียนถึงการใช้โดยเชื่อมกับData Control (Bound to Data Control ซะส่วนใหญ่ ไม่ค่อยมีเล่มไหนกล่าวถึง Unbound เลย อาจเป็นเพราะการใช้ Unbound ค่อนข้างยาก เลยไม่ค่อยมีกล่าวถึง สำหรับสัปดาห์หน้าจะอธิบายการใช้ Unbound DBGrid
ตัวอย่างโปรแกรม
    ตัวอย่างแรก DownLoad เป็นการใช้กริดแบบง่ายๆ (ใข้ VB5)

  การใช้ DBGrid กับ Data Control
  หลังแก้ไขข้อมูล เมื่อกด Enter ให้เลื่อนไปช่องถัดไป
  เมื่อกด Enter ถึงช่องสุดท้าย ให้เลื่อนไปบรรทัดใหม่
  ใส่แถบแสง(Highlight)แถวปัจจุบันให้กับBound DBGrid
  การอ้างถึงตัวแปรคอลัมน์ขณะ Runtime
  เมื่อต้องการตรวจสอบข้อมูลที่ป้อนก่อนUpdate
  การใช้ Unbound Grid
  การเลือกเรคคอร์ดโดยใช้โปรแกรมและการค่าไปใช้
  เมื่อต้องการอ้างถึงเรคคอร์ดที่เลือก

การใช้ DBGrid กับ Data Control

  ขั้นการการสร้าง
1.ลากเรื่องมือ Data Control ไปวางไว้บน ฟอร์ม แล้ว Properties ของData Control ดังนี้
   Connect เช่นเลือก Acess
   DatabaseName เลือก C:\VB\Biblio.MDBชื่อฐานข้อมูล
   RecordType เลือก 1-Dynaset
   RecordSource เลือก Authors เป็นตารางฐานข้อมูล
2 ลาก DbGrid วางบนฟอร์ม แล้วกำหนดProperties DataSource โดยใช้ F4 ใส่ Data1
3 กดเมาส์ปุ่มขวาที่ DBGrid เลือก Retrive Fields แค่นี้ก็ใช้งานได้แล้ว
4 กดเมาส์ปุ่มขวาที่ DBGrid เลือก Edit เพื่อเข้าสู่ Mode แก้ไข เพิ่ม/ลบฟิลด์ให้ใช้เมาศ์ปุ่มขวาอีกครั้ง
5 กดเมาส์ปุ่มขวาที่ DBGrid เลือก Properties เพื่อแก้ใชคุณสมบัติอื่น เช่น Allowaddnew, AllowDelete

ศึกษาได้จากตัวอย่างแรก

 

หลังแก้ไขข้อมูล เมื่อกด Enter แล้วให้เลื่อนไปช่องถัดไป
  เพื่อช่วยให้สะดวกกับผู้ใช้ ถ้ากรณีแก้ไขข้อมูลแล้วกด Enter ให้เลื่อนไปช่องถัดไปเลย ปกติ DBGrid จะต้องกด Enter 2 ครั้ง เพื่อแก้ไขปัญหานี้ ให้ทำดังนี้
1. กำหนดตัวแปร ถ้าใช้มากกำหนดเป็น Global เลยก็ได้
     Dim gKeyCode as Integer
2. ตรงเหตุการณ์ DBGrid1_KeyDown ใส่
     Private Sub DBGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
         gKeyCode = KeyCode
     End Sub
3. ตรงเหตุการณ์ DBGrid1_AfterColEdit ใส่
     Private Sub DBGrid1_AfterColEdit(ByVal ColIndex As Integer)
         If gKeyCode = 13 Then
             SendKeys "{Enter}"
        End If
     End Sub
ศึกษาได้จากตัวอย่างแรก

เมื่อกด Enter ถึงช่องสุดท้าย ให้เลื่อนไปบรรทัดใหม่
  ช่วยให้สะดวกกับผู้ใช้ ขึ้นไปอีกคือเมื่อกด Enter ถึงช่องสุดท้ายแล้วให้ขึ้นบรรทัดใหม่ ปกติ DBGrid เมื่อกด Enter ถึงช่องสุดท้ายแล้วหยุดอยู่ตรงนั้น ผมหาวิธีใช้อยู่เกือบอาทิตย์ในช่วงที่ใช้ใหม่ๆ เห็นว่ามีประโยชน์เลยนำมาบอกกล่าวไว้ เพื่อว่าท่านจะได้ไม่ต้องเสียเวลาศึกษา
  คือท่านต้องกำหนด Properties WrapCellPointer = True
  ถ้าใช้เมาส์ ปุ่มขวา -> Properties ให้เลือกแถบขั้น Keyboard

ศึกษาได้จากตัวอย่างแรก

ใส่แถบแสง (HighLight) แถวปัจจุบันให้กับ BOUND DBGrid
  การใส่แถบแสงนี้จะใช้ได้เฉพาะ DBGrid ที่ Bound กับ Data Control เท่านั้น
  Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
     On Error Resume Next
     If Data1.Recordset.RecordCount Then
          DBGrid1.SelBookmarks.Add Data1.Recordset.Bookmark
     End If
  End Sub

ศึกษาได้จากตัวอย่างแรก
อนึ่งหากท่านใช้ VB5 แล้ว ถ้าจะทำแถบแสง
1. ให้ไปที่ Properties (ใช้เมาส์ปุ่มขวาที่ DBGrid)
2. แล้วเลือกแถบคั่น Splits
3. แล้วเปลี่ยน ComboBox ตรง MarqueeStyle ให้เป็น 3-HighLight Row

การอ้างถึงตัวแปรคอลัมน์ขณะ Runtime
   การอ้างถึงตัวแปรคอลัมน์ขณะRuntime ใช้มากดังนั้นจำเป็นต้องทราบ มีการอ้างได้ 3 แบบคือ
   1. DBgrid1.Columns(n)  อ้างถึงโดยใช้ Column Index โดย n = 0,1,2,...
   2. DBgrid1.Columns("LAST") อ้างถึงโดยใช้ชื่อ Data Field
   3. DBgrid1.Columns("Last Name") อ้างถึงโดยใช้ Caption ของ Culumns
   การใช้งานเช่น
   เมื่อต้องการอ้างค่าช่อง(Cell) เป็น Text
        CellText = DBGrid1.Columns(ColIndex).Text
   เมื่อต้องการอ้างค่าช่อง(Cell) เป็น Value (Variant)
        CellValue = DBGrid1.Columns(ColIndex).Value
   นอกจากนี้ ยังใช้
    DBGrid1.Col เพื่ออ้างถึง Columns ขณะอยู่ตรง DBGrid1_KeyPress เป็นต้น

เมื่อต้องการตรวจสอบค่า(Validate)ก่อนUpdate

    ถ้าต้องการตรวจสอบค่า เราจำเป็นต้องอ้างตัวแปรคอลัมน์ แล้วใช้ตรงเหตุการณ์
     DbGrid1_BeforeUpdate หรือ DbGrid1_BeforeColUpdate แล้วแต่กรณี ดังตัวอย่าง
   Private Sub DBGrid1_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant, Cancel As Integer)
     If ColIndex = 2 Then
         If Val("" & DBGrid1.Columns(ColIndex).Value) < 1990 Then
            MsgBox "Year must gather than 1900", , "Error"
            Cancel = True
         End If
     End If
   End Sub
   ในกรณีที่ข้อมูลไม่ถูกต้องให้ Cancel = True
    การตรวจสอบข้อมูลนี้มีประโยช์นมาก และนอกจากนี้แล้วเราใช้เหตุการณ์
    DBGrid1_KeyPress เพื่อจำกัดตัวอักษรที่จะป้อนด้วย
   ศึกษาได้จากตัวอย่างแรก

การใช้ Unbound Grid

     เนื่องจากผมไม่ชอบใช้ Grid หรือ Flex เพราะว่า Edit ไม่ได้ต้องใช้วิธีสร้าง Text Box แทน ดังนั้นจึงต้องมาใช้ Unbound Grid แต่การใช้ Unbound Grid เป็นเรื่องที่เข้าไจยากมาก จนถึงบัดนี้ผมยังไม่ค่อยเข้าใจกับ UnboundAddData UnboundReadData, UnboundWriteData, UnboundDeleteRow และ RowBuffer   ผมทราบเพียงคร่าวๆเท่านั้นเอง ดังนั้นผมไม่กล้าที่จะอธิบาย เพราะกลัวผิด   แต่ว่าผมใช้วิธีแกะจากโปรแกรมตัวอย่างที่มาจาก Stand DBGrid ที่ Site www.apexsc.com   ผมแกะทีละนิดๆ   กว่าจะทดสอบและสามารถใช้เป็นต้นฉบับที่ผมใช้มาจนบัดนี้ ต้องใช้เวลาร่วมเดือน ถ้าจะให้ผมอธิายถึงที่มานั้น ผมไม่สามารถอธิบายได้ แต่ผมได้อธิบายการใช้ไว้ในตัวอย่าง ถ้าท่านศึกษาจากตัวอย่างรับรองว่าไม่เกิน 15 นาที หรืออย่างมากสุด ก็ 1 ชม. คุณสามารถใช้ได้อย่างสบายมาก
      ผมคิดว่ามันเหมือนกับคอมพิวเตอร์นี้แหละ ผมใช้คอมพิวเตอร์ได้ แต่ผมไม่รู้หรอกว่า IC ตัวไหนทำหน้าที่อะไร ในทำนองเดียวกัน Unbound Grid ผมรู้เพียงแค่วิธีนำไปใช้ แต่ไม่รู้ว่า RowBuffer ทำอะไร เพราะไม่มีเวลาศึกษาด้วย
      หากว่าท่านต้องการทราบรายละเอียดการใช้ UnboundAddData UnboundReadData, UnboundWriteData, UnboundDeleteRow และ RowBuffer ท่านต้องศึกษาเอง และ ศึกษาจากตัวอย่างที่สอง ซึ่งเป็นตัวอย่างจากต้นฉบับของ Standard DBGrid ที่ผมDownload มา
      หากท่านต้องการแค่นำไปใช้งานให้ดูตัวอย่างที่สาม   คุณจะพบว่าคุณจะใช้เวลาเร็วมาก ถ้าต้องการนำ Unbound DBGrid ไปใช้ เพียงแต่แก้ไขตามคำแนะนำในโปรแกรมที่ผมเขียนไว้ให้
      สำหรับตัวอย่างสี่นั้นเป็นโปรแกรมตกแต่งเพิ่มเติมจากตัวอย่างสาม ให้มีความสมบูรณ์ยิ่งขึ้น เช่นมีการคำนวณใน DBGrid


    ตัวอย่างสอง DownLoad เป็นการใช้Unbound Grid (ต้นฉบับ) (ใข้ VB5)
    ตัวอย่างสาม DownLoad เป็นการใช้Unbound Gridที่ปรับปรุงใหม่ซี่งผมใช้อยู่จนบัดนี้(ใข้ VB5)
    ตัวอย่างสี่ DownLoad เป็นการใช้Unbound Gridจากตัวอย่างสามที่ได้รับการตกแต่ง (ใข้ VB5)

     หวังไว้ว่าตัวอย่างที่สามคงศึกษาไม่ยากนะครับ ผมใช้รูปแบบนี้มาแล้วเกือบ 2 ปีแล้วไม่เจอ Bug แต่ถ้ามี Bug กรุณาบอกด้วยจะเป็นพระคุณอย่างสูง

การเลือกเรคคอร์ดโดยโปรแกรม
     การใช้ DBGrid   ถ้าเลือกเรคคอร์ดให้ใช้เมาส์คลิกที่ก้อนสี่เหลี่ยมหัวแถว และ ถ้าต้องการเลือกหลายเรคคอร์ดให้กดแป้น CTRL ค้างไว้แล้วเมาส์คลิก
     นอกจากเราใช้แป้นพิมพ์แล้ว เราสามารถใช้โปรแกรมเลือกได้ดัง โปรแกรมดังนี้
     '**** กำหนดตัวแปรเพื่อใช้ Recordset Clone
     Dim dclone As Recordset
     Set dclone = Data1.Recordset.Clone()
     '**** กำหนดตัวแปรเพื่อใช้เลือกเรคคอร์ด
     Dim SelBks As SelBookmarks
     Set SelBks = DBGrid1.SelBookmarks
     '** กำหนดเงื่อนไขที่จะเลือก
     Dim Criteria$
     Criteria$ = "[Au_Id] = 2 Or [Au_Id] = 4 OR [Au_Id] = 10 OR [Au_Id] = 12 "
     '*** วนลูปเพื่อเลือกค่า
      dclone.FindFirst Criteria$
      Do While Not dclone.NoMatch
            SelBks.Add dclone.Bookmark    '*** ใช้ Add เพื่อเลือกเรคคอร์ด
            dclone.FindNext Criteria$
      Loop

  หากต้องการล้างค่าของเรคคอร์ดที่เลือกไว้ทั้งหมด

     Dim SelBks As SelBookmarks
     Set SelBks = DBGrid1.SelBookmarks
     Do While SelBks.Count <> 0  '*** ใช้ Count เพื่อนับจำนวนที่เลือก
           SelBks.Remove 0  '*** ใช้ Remove 0 เพื่อล้างทั้งหมด
     Loop

  ตัวอย่างที่ห้าให้ Download

เมื่อต้องการอ้างถึงเรคคอร์ดที่เลือก
     จากหัวข้อที่แล้ว เมื่อเลือกเรคคอร์ดได้แล้ว หลายๆคนไม่รู้ว่าจะเลือกอย่างไร มีผู้อ่านได้ส่ง Mail มาถาม ผมเลยต้องเขียนส่วนนี้เพิ่มเติมขึ้นมา เผื่อว่าจะมีใครสนใจจะนำไปใช้อีก

     '**** กำหนดตัวแปรเพื่อใช้ Recordset Clone
     Dim dclone As Recordset
     Set dclone = Data1.Recordset.Clone()
     '**** กำหนดตัวแปรเพื่อใช้เลือกเรคคอร์ด
     Dim SelBks As SelBookmarks
     Set SelBks = DBGrid1.SelBookmarks
     '**
     If SelBks.Count <> 0 Then
         For i = 1 To SelBks.Count   '**** Count จะเริ่มจาก 1,2,3
             dclone.Bookmark = SelBks.Item(i - 1) '*** Item จะคือ BookMark และเริ่มจาก 0,1,2
             List1.AddItem dclone!Au_ID   '*** เมื่อได้ Bookmark แล้วสามารถนำค่าไปใช้ได้
         Next
     End If

  ตัวอย่างที่ห้าให้ Download

หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer