หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer
การใช้งานDBGrid
หัวข้อนี้จะแนะนำการใช้ DBGrid การใช้ DBGrid นั้นไม่ค่อยมีหนังสือกล่าวถึงรายละเอียดมากนัก แม้กระทั่งหนังสือจากต่างประเทศกล่าวน้อยมาก ส่วนใหญ่มักจะเขียนถึงการใช้โดยเชื่อมกับData Control (Bound to Data Control ซะส่วนใหญ่ ไม่ค่อยมีเล่มไหนกล่าวถึง Unbound เลย อาจเป็นเพราะการใช้ Unbound ค่อนข้างยาก เลยไม่ค่อยมีกล่าวถึง สำหรับสัปดาห์หน้าจะอธิบายการใช้ Unbound DBGrid
ตัวอย่างโปรแกรม
ตัวอย่างแรก DownLoad เป็นการใช้กริดแบบง่ายๆ (ใข้ VB5)
การใช้ 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