Option Explicit
' ตัวแปรเก็บค่าในการจัดเรียงข้อมูล
' SortOrder = 1 คือ การจัดเรียงจากน้อยไปหามาก (Ascending)
' SortOrder = 2 คือ การจัดเรียงจากมากไปหาน้อย (Descending)
Dim SortOrder As Byte
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
Call SetupfgData
Call DisplayfgData
' กำหนดค่าเริ่มต้น
SortOrder = 0
End Sub
' ตั้งค่าคุณสมบัติ (Properties) ต่างๆให้กับ MS FlexGrid แบบ Run - Time
Sub SetupfgData()
With fgData
.Clear
' มี Header 1 แถว
.FixedRows = 1
.FixedCols = 0
' ให้แถบแสงยาวตามแนวนอนของแต่ละแถว
.SelectionMode = flexSelectionByRow
' ตั้งค่าความสูงต่ำสุดของแต่ละแถว
.RowHeightMin = 285
' ไม่ยอมให้ผู้ใช้คลิ๊กย่อ - ขยายความกว้างของแต่ละหลัก
.AllowUserResizing = flexResizeNone
' กำหนด 5 หลัก
.Cols = 5
' กำหนด 1 แถว (สำหรับ Header)
.Rows = 1
' กำหนด Header
.TextMatrix(0, 0) = "ProductPK" ' ปกติเราควรซ่อน Primary Key ไว้ที่หลัก 0 - DataBase
.TextMatrix(0, 1) = "ลำดับที่"
.TextMatrix(0, 2) = "รหัสสินค้า"
.TextMatrix(0, 3) = "วันที่รับสินค้า"
.TextMatrix(0, 4) = "ราคา"
' ให้หลักที่ 2 (รหัสสินค้า) แสดงตำแหน่งชิดซ้าย
.ColAlignment(2) = vbLeftJustify
.ColWidth(0) = 0
.ColWidth(1) = 650
.ColWidth(2) = 1400
.ColWidth(3) = 2200
.ColWidth(4) = 2150
End With
End Sub
' ใส่ข้อมูลตัวอย่างลงไปใน MS FlexGrid
Sub DisplayfgData()
Dim i As Integer
fgData.Rows = 6
For i = 1 To 5
With fgData
.TextMatrix(i, 0) = i
.TextMatrix(i, 1) = i
.TextMatrix(i, 2) = Right$("0000000" & i, 7)
.TextMatrix(i, 3) = FormatDateTime(Now() + i, vbShortDate)
.TextMatrix(i, 4) = 6 - i
End With
Next
' อันนี้ผมเจตนาใส่รายการมามั่วเอง เพื่อให้เห็นผลของการจัดเรียงได้อย่างชัดเจน
fgData.TextMatrix(2, 3) = "05/02/52"
fgData.TextMatrix(3, 4) = 9
End Sub
' เหตุการณ์สำคัญ ... เมื่อคลิ๊กเมาส์ซ้ายลงบน MS FlexGrid
Private Sub fgData_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
' กระบวนการแนวคิดแบบตื้นๆ ... สะอื้นทรวง ... 55555+ ... อยากรู้ว่าผู้ใช้คลิ๊กที่ Header หรือไม่ ?????
' ตรวจสอบตำแหน่งของเมาส์ที่ชี้ไปแกน y จะต้องมีค่าน้อยกว่าความสูงของแถวแรก (Header)
' นั่นก็คือ ... ผู้ใช้คลิ๊กเลือก Header ยังไงล่ะครับ ... พี่น้อง ... ไม่เห็นจะยากเลย
' Debug.Print "ความสูงแถวแรก = " & fgData.RowHeight(0) & vbCrLf & "พิกัด y = " & y
If y < fgData.RowHeight(0) Then
' ระบุหลักที่ใช้ในการจัดเรียงข้อมูล
fgData.Col = fgData.MouseCol
' ไปโปรแกรมย่อยในการจัดเรียงข้อมูลใหม่
Call SortGrid
End If
End Sub
Private Sub SortGrid()
' ลักษณะของการ Toggle หรือ การทำงานสลับไปมา
' 1 = การจัดเรียงจากน้อยไปหามาก (Ascending - ASC)
' 2 = การจัดเรียงจากมากไปหาน้อย (Descending - DESC)
' หากเคยจัดเรียงจากมากไปหาน้อย (SortOrder = 2) ...
' ต้องลดค่าลง 1 เพื่อสลับการเรียงจากน้อยไปหามาก หรือ SortOrder = 1
If SortOrder = 2 Then
SortOrder = SortOrder - 1
' หากไม่ใช่ 2 แสดงว่าค่า SortOrder เป็น 0 หรือ 1 ...
' หากเป็น 0 ก็บวกเข้าไปอีก 1 ก็จะได้ 1 ซึ่งเป็นการเรียงแบบน้อยไปหามาก
' หากเป็น 1 ก็บวกเข้าไปอีก 1 ก็จะได้ 2 ซึ่งเป็นการเรียงแบบมากไปหาน้อย
Else
SortOrder = SortOrder + 1
End If
' จัดเรียงค่าตามหลักที่กำหนด
fgData.Sort = SortOrder
' ให้เแสดงแถบแสงในแถวแรกบนสุด
SendKeys "{DOWN}"
fgData.Col = 0
fgData.Row = 0
fgData.RowSel = 0
End Sub
|