Visual Basic

Home

Visual Basic Tutorial
Knowledge Developer Database Internet Resource
Database Contol
1. DataCombo และ Data List
2. DataGrid
3. Hierachical FlexGrid
4. Data Report
 
Visual Basic Tutorial
1. Visual Basic 6
2. ฟอร์ม
3. Intrinsic Control
4. ตัวแปรและ Procedure
5. Class
6. Common Control1
7. Common Control2
8. ActiveX Control
9. Interface
10. ฐานข้อมูล
11. Database Control
 
Developer
Visual Basic
Microsoft Access
Microsoft Excel
 

DataGrid

DataGrid เป็นตัว control ที่แสดงข้อมูลจาก table ของฐานข้อมูลในรูปตาราง และทำงานกับ ADO Data control โดย DataGrid รวมอยู่ในไฟล์ MSDATGRD.ocx ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้

การตั้งค่าคุณสมบัติ เมื่อออกแบบ

DataGrid สามารถทำงานได้เฉพาะ การรวมกับ data source ในเวลาออกแบบได้แก่ ADO data control ส่วน data source ในเวลาเรียกใช้ ได้แก่ ADO Recordset หรือ instance ของ class ที่กำหนด การทำงานกับ data source ในเวลาออกแบบ มีความสะดวกเพราะสามารถดึงโครงสร้างฟิลด์และจัดความกว้างคอลัมน์ รวมถึงคุณลักษณะ ที่มองเห็นได้ โดยไม่ต้องใช้คำสั่ง

Note: การรวมตัว Control ที่ซับซ้อน เช่น DataGrid และ Hierarchical FlexGrid สามารถรวมได้เฉพาะ Recordset ที่มาจาก cursor ชนิด static หรือ keyset

การแก้ไขผังคอลัมน์

หลังจากที่รวม DataGrid กับ ADO data control หรือ อ๊อบเจค Command ของ DataEnvironment ผ่านคุณสมบัติ DataSource ของ DataGrid แล้วให้คลิกเมาส์มุมขวาบนตัว control แล้วเลือกคำสั่ง Retrieve Field เพื่อเตรียมปรับผังคอลัมน์ด้วยดึง caption และ ความกว้างของแต่ละคอลัมน์โดยตรงจากฐานข้อมูล และสามารถคลิกเมาส์บนตัว control อีกครั้งแล้วเลือกคำสั่ง Edit ซึ่งจะนำตารางเข้าสู่โหมด Edit ในโหมด Edit ให้ทำการปรับความกว้าง เลื่อนตารางตามแนวนอนด้วยแถบเลื่อนด้านล่าง และคลิกเมาส์มุ่มขวาบนตัว control เพื่อแสดงเมนู ของคำสั่ง ในคำสั่งนี้จะยอมให้เพิ่มหรือยกเลิกคอลัมน์ แบ่งตารางเป็นส่วนย่อย ๆ ติดหรือวางเพื่อจัดลำดับใหม่ เป็นต้น การปรับปรุงคุณสมบัติอื่น ให้คลิกเมาส์มุ่มขวาบนตัว control อีกครั้ง แล้วเลือกคำสั่ง Properties เพื่อเปิดไดอะล๊อกบ๊อกซ์ ของ Property Pages

ในการจัดผังคอลัมน์ของ Split มีความยุ่งยาก เช่น การลบคอลัมน์ใน Split จะมีผลต่อคอลัมน์ภายใน Split การแก้ปัญหาให้ตั้งคุณสมบัติ Visible ของคอลัมน์เป็น False เพราะคุณลักษณะนี้ สามารถตั้งค่าแบบ split-by-split

แท็บ General และ Keyboard

ตามค่าเริ่มต้น ตารางจะไม่มี caption แต่สามารถป้อนข้อความที่ต้องการในแท็บ General ที่คุณสมบัติ Caption ซึ่งจะปรากฏในส่วนสีเทาเหนือชื่อคอลัมน์ คุณสมบัติ AllowAddNew, AllowDelete, และ AllowUpdate เป็นคุณสมบัติ Boolean ใช้หาการทำงานตามที่กำหนดบนตาราง คุณสมบัติ ColmnHeader สามารถตั้งเป็น False เพื่อซ่อนแถวของชื่อคอลัมน์ หมายเหตุในแท็บ Font สามารถตั้งค่าคุณสมบัติ HeadFont เพื่อคำนวณลักษณะฟอนต์ของคอลัมน์

คุณสมบัติ DefColWidth เป็นค่าเริ่มต้นความกว้างของคอลัมน์ ถ้าตั้งค่าเป็น 0 (ค่าเริ่มต้น) ความกว้างของแต่ละคอลัมน์เป็นค่ากว้างที่สุดฟิลด์ และความกว้างชื่อคอลัมน์ คุณสมบัติ HeadLines เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 10 ตรงตามจำนวนแถวที่ใช้ของชื่อคอลัมน์ แต่ควรตั้งคุณสมบัติ ColmnHeader เป็น False คุณสมบัติ RowHeight เป็นความสูงของแถว เป็น twips

ถ้าตั้งค่าคุณสมบัติ BorderStyle เป็น 0-dbgNoBorder จะไม่มีเส้นขอบ คุณสมบัติ RowDividerLine เป็นรูปแบบของเส้นแบ่งแถว

แท็บ Keyboard สำหรับการตั้งค่าคุณสมบัติที่มีผลต่อพฤติกรรมคีย์บอร์ดเพื่อ DataGrid ได้รับโฟกัส ถ้าตั้งค่าคุณสมบัติ AllowArrows เป็น True ผู้ใช้สามารถเลื่อนไปตามเซลล์ด้วยปุ่มลูกศร ถ้า WrapCallPointer เป็น True ถ้ากดมุ่มลูกศรขวาที่ท้ายของแถว โฟกัสจะเลือนไปที่เซลล์ของแถวต่อไป และกดปุ่มลูกศรซ้าย ที่ตอนต้นของแถวโฟกัสจะเลื่อนไปเซลล์สุดท้าย ของแถวก่อนหน้า

คุณสมบัติ TabAction เป็นการกำหนดพฤติกรรม เมื่อกดปุ่ม Tab หรือ Shift + Tab และ DataGrid บนตัว control ปัจจุบัน ซึ่งมีค่าเริ่มต้นเป็น 0-dbgControlNavigation จะทำให้ตัว control ต่อไปได้รับโฟกัส ถ้าตั้งแต่เป็น 1-dbgColumnNavigation เมื่อกดปุ่ม Tab โฟกัส จะเลื่อนไปยังคอลัมน์ต่อไป แต่เซลล์ปัจจุบันอยู่ที่เซลล์สุดท้ายของแถว โฟกัสจะเลื่อนไปยังตัว control ต่อไป สำหรับการตั้งค่า 2-dbgGridNavigation โฟกัสจะอยู่ภายในตัว control

ตามที่ค่าเริ่มต้นปุ่ม Tab และ ปุ่มลูกศรจะไม่โฟกัสที่ Split แต่ค่าตั้งแต่คุณสมบัติ TabAcrossSplit เป็น True โฟกัสจะเข้าไปใน Split โดยใช้ ปุ่ม Tab

แท็บ Column และ Format

แท็บ Column ยินยอมให้ตั้งค่าคุณสมบัติ Caption ของแต่ละอ๊อบเจค Column เช่นเดียวกับคุณสมบัติ DataField ที่เก็บชื่อฟิลด์ในแหล่งข้อมูลของคอลัมน์

แท็บ Format ยินยอมให้ตั้งค่าคุณสมบัติ DataFormat ของแต่ละอ๊อบเจค Column

แท็บ Splits

ถ้าตารางมีการแบ่งส่วนเป็น 2 ส่วนขึ้นไป การตั้งค่าคุณลักษณะ ของพื้นที่ในแท็บ Split การปรับปรุงคุณลักษณะของ Split ให้เลือก Split จาก รายการ drop-down ด้านบน ถ้าตารางไม่มีการแบ่งการกำหนดคุณสมบัติ จะมีผลต่อตัว control
คุณสมบัติ Locked ถ้าตั้งเป็น True จะทำการเปลี่ยนเป็นแบบอ่านอย่างเดียว
คุณสมบัติ AllowFocus เป็นการให้ Split สามารถรับโฟกัส คุณสมบัติ AllowSizing เป็นกำหนดให้มีการปรับขนาดด้วยเมาส์ได้เมื่อเรียกใช้
คุณสมบัติ AllowRowResizing ถ้าเป็น True ผู้ใช้สามารถปรับความสูงแถวด้วยเมาส์
คุณสมบัติ RecordSelectors เป็นการแสดงคอลัมน์สีเถาสำหรับเลือกเรคคอร์ดด้านซ้ายสุดของ Split
คุณสมบัติ MarqueeStyle สำหรับหาการไฮไลต์เซลล์ปัจจุบันที่เลือก
คุณสมบัติ AllowRowResizing, RecordSelectors และ MarqueeStyle ถ้ากำหนดใน DataGrid จะมีผลต่อ Split

แท็บ Layout

แท็บ Layout ใช้ตั้งคุณลักษณะของคอลัมน์แบบ split-by-split โดย DataGrid ยินยอมให้แสดงคอลัมน์เดียวกันสามารถแสดงคุณลักษณะต่างกันในคนละ Split การตั้งค่าให้เป็นแบบอ่านอย่างให้กำหนดที่คุณสมบัติ Locked และการมองเห็น กำหนดที่คุณสมบัติ Visible คุณสมบัติ AllowSizing เป็นค่า Boolean สำหรับการหาค่าคอลัมน์สามารถปรับได้ คุณสมบัติ Button ค่าตั้งเป็น True จะมีปุ่ม drop-down ปรากฏขึ้นเพื่อ เซลล์ได้รับโฟกัสเมื่อมีการคลิกปุ่มนี้ จะเกิด ButtonClick event

การทำงานเมื่อเรียกใช้

DataGrid มีความซับซ้อน ต้องใช้ในเวลาในการศึกษา

การทำงานกับเซลล์ปัจจุบัน

เมื่อมีการเรียกใช้ DataGrid จะใช้คุณสมบัติ Row และ Col ในการส่งออกหรือตั้งตำแหน่งของเซลล์ที่ได้รับโฟกัส แถวแรกและคอลัมน์ซ้ายจะส่งคืนค่าเป็น 0 เมื่อมีการให้เซลล์เป็นเซลล์ปัจจุบันจะสามารถดึงค่าหรือปรับปรุงด้วยคุณสมบัติ Text

Private Sub cmdUpperCase_Click ()
   DataGrid1.Text = UCase$(DataGrid1.Text)
End sub

คุณสมบัติ EditActive ส่งค่า True ถ้าเซลล์ปัจจุบันได้รับการแก้ไข และสามารถกำหนดค่าให้คุณสมบัตินี้เพื่อป้อนค่าหรืออกจากการแก้ไข เมื่ออยู่ในโหมด Edit จะเกิด ColEdit event

Private Sub DataGrid1_ColEdit (ByVal Colindex As Integer)
   ' Savetext เป็นตัวแปรระดับโมดูล
   Savetext = DataGrid1.Text
End sub

การหาเซลล์ปัจจุบันที่ได้รับการแก้ไข สามารถค้นหาจากคุณสมบัติ CurrentCellModified และ สามารถตั้งค่าคุณสมบัติ เป็น False และตั้งค่าคุณสมบัติ EditActive เป็น False เพื่อยกเลิกการแก้ไข คุณสมบัติ CurrentCellVisible มีใน DataGrid และอ๊อบเจค Split จะส่งออกค่า True ถ้าเซลล์ที่สามารถมองเห็นในอ๊อบเจค เมื่อมีการแก้ไขเซลล์ จะสามารถอ่านและปรับปรุงตารางด้วยคุณสมบัติ SelStart, SelLength และ SelText
เนื่องจาก DataGrid ใช้รวมกับแหล่งข้อมูล ADO ถ้าให้สามารถใช้คุณสมบัติ Bookmark เพื่อตั้งค่าหรือส่งออก bookmark ไปที่เรคคอร์ด

การเข้าถึงเซลล์

การเข้าถึงเซลล์ใด ๆ ในตารางสามารถใช้ bookmark โดยอ๊อบเจค Column มี เมธอด CellText และ CellValue ที่ส่งออกข้อมูลของไม่ยัง bookmark และการดึง bookmark ที่สัมพันธ์กับแถว ใช้เมธอด GetBookmark ซึ่งจะได้ค่าแถวที่สัมพันธ์กับแถวปัจจุบัน หรือเมธอด RowBookmark ที่ส่งออก bookmark ของแถวที่มองเห็น และ bookmark ของแถวแรกเป็นค่าที่ส่งออกโดยคุณสมบัติ FirstRow และมีคุณสมบัติ LeftCol รักษาดัชนีของคอลัมน์แรกที่มองเห็น

DataGrid1.LeftCol = 0
Adodc1.Recordset.MoveFirst
DataGrid1.Current.CellVisible = True

คุณสมบัติ VisibleRows และ VisibleCol เป็นคุณสมบัติอ่านอย่างเดียวที่ส่งออกจำนวนแถวและคอลัมน์ สามารถใช้คุณสมบัติ ApproxCount ส่งออกจำนวนแถวโดยประมาณ และจำนวนคอลัมน์หาได้จากคุณสมบัติ Count ใน Column collection

การจัดการเซลล์ที่เลือก

การเลือกคอลัมน์ของคอลัมน์ที่อยู่ติดต่อกัน ทำได้โดยการคลิกส่วนหัวคอลัมน์พร้อมกับกดปุ่ม Shift ค้างไว้ โดยคุณสมบัติ SelStartCol และ SelEndCol จะส่งออกดัชนีของคอลัมน์แรกและคอลัมน์สุด ส่วนการเลือกแถวสามารถเลือกแบบไม่อยู่ติดต่อกันได้
การยกเลิกการเลือกคอลัมน์ด้วยการตั้งค่าคุณสมบัติ เป็น -1 หรือการกระตุ้นเมธอด ClearSelCols คุณสมบัติและเมธอดเหล่านี้สามารถเกิดขึ้นโดยอ๊อบเจค Split
เนื่องจากผู้ใช้สามารถเลือกแถวแบบไม่เรียงลำดับ ระบบจะค้นหาแถวที่ได้รับการเลือกบน SelBookmarks collection ของ DataGrid ซึ่งเก็บ bookmark ของแถวที่เลือก ตัวอย่างการเลือกแถวปัจจุบัน
DataGrid1.SelBookmarks.Add DataGrid1.Bookmark

การเลือกแถวสามารถใช้ For…Each…Next ตามตัวอย่างคำสั่งที่ใช้ประโยชน์ SelChange event ซึ่งเกิดขึ้น เมื่อมีการเลือกคอลัมน์หรือแถว

Private Sub DataGrid1_SelChange(Cancel As Integer)
Dim total As Single, bmark As Variant
   For Each bmark In DataGrid1.SelBookmarks
      total = total - DataGrid1.Columns("Total").CellValue(bmark)
   Next
End Sub

การติดตามการแก้ไข

DataGrid มี event จำนวนมากที่ให้ใช้ในการทำงานอย่างของผู้ใช้ event ส่วนมากอยู่รูปของ BeforeXXXX และ AfterXXXX โดย BeforeXXXX จะรับพารามิเตอร์ Cancel ซึ่งสามารถตั้งค่าเป็น True เพื่อยกเลิกการทำงาน

Private Sub DataGrid1_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant, Cancel As Integer)
   ' จัดการค่าที่ไม่ถูกต้อง
End Sub

เมื่อมีการปรับข้อมูล DataGrid จะได้รับ Change event

Dim newCellText As String

Private Sub DataGrid1_Change()
   NewCellText = DataGrid1.Text
End Sub

การแทรกและลบ

ผู้ใช้สามารถลบแถว 1 แถว หรือมากกว่า โดยเลือกแถวที่ต้องการแล้วกดปุ่ม Delete ซึ่งจะเกิด BeforeDelete event และ AfterDelete event จากนั้นจะเกิดคู่ของ BeforeUpdate event และ AfterUpdate event

dgdProduct As DataGrid

Private Sub dgdProduct_BeforeDelete(Cancel As Integer)
   ' ปฏิเสธการลบ สินค้าถ้ามี เรคคอร์ดใน OrderDetail ชี้มาที่สินค้านั้น
   Dim rs As ADODB.Recordset, rsorderdetail As ADODB.Recordset, sql As String
   ' ดึงเรคคอร์ดทั้งหมดใน OrderDetails ที่อ้างอิงสินค้านี้
   Set rs = adoProduct.Recordset
   sql = "Select * FROM [Order Details] WHERE [Order Details].ProductID = " & rs("ProductID")
   Set rsorderdetail = rs.ActiveConnection.Execute(sql)
   ' ถ้า recordset เก้นเรคคอร์ดใดๆ ปกิเสธการลบ
   If Not rsorderdetail.EOF Then Cancel = True
End Sub

ถ้าคุณสมบัติ AllowAddNew เป็น True การมีแถวเปล่าเกิดขึ้นใน DataGrid และมีลักษณะดอกจันจากนั้นผู้ใช้สามารถป้อนข้อมูลเข้าสู่แถวใหม่ ตัว control จะเกิด BeforeInsert event แล้วตามด้วย AfterInsert event แล้วเกิด OnAddNew event

การเรียงข้อมูล

DataGrid ไม่มีฟังก์ชันการเรียงข้อมูล แต่สามารถใช้ HeadClick event และคุณสมบัติ Sort ของ Recordset

Private Sub dgdProduct_HeadClick(ByVal ColIndex As Integer)
   ' เรียงคอลัมน์ที่คลิก
   Dim rs As ADODB.Recordset
   Set rs = adoProduct.Recordset

   If rs.Sort <> dgdProduct.Columns(ColIndex).DataField & " ASC" Then
      ' เรียงตามลำดับจากน้อยไปมาก - บล๊อกนี้ได้รับการประมวลผล
      ' ถ้า grid ไม่มีการเรียงหรือเรียงด้วยฟิลด์อื่น หรือเรียงจากมากไปน้อย
      rs.Sort = dgdProduct.Columns(ColIndex).DataField & " ASC"
   Else
   ' เรียงจากมากไปน้อย
      rs.Sort = dgdProduct.Columns(ColIndex).DataField & " DESC"
   End If
   ' ไม่ต้อง refresh ข้อมูลของ Data grid
End Sub

ดาวน์โหลดตัวอย่าง (DataGrid.vbp)

 

  

สงวนลิขสิทธิ (C) widebase