ผู้เขียน หัวข้อ: [VB6] การจัดกลุ่มข้อมูลใน SharpGrid แบบผูกข้อมูล (Bound Data Control) - ภาค 2  (อ่าน 277 ครั้ง)

ออฟไลน์ ทองก้อน ทับทิมกรอบ

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
จากตอนที่แล้วเป็นจุดเริ่มต้นหรือปฐมบท การใช้งาน SharpGrid แบบผูกข้อมูล (Bound Data Control) คราวนี้แอดมินจะแสดงศักยภาพของ SharpGrid ในการจัดกลุ่มแบบลากแล้ววาง (Drag & Drop) ... อนึ่ง!!! แอดมินขอแนะนำถึงข้อดีของการเขียนโค้ดแบบ Run-Time แทนการกำหนดค่าคุณสมบัติ (Properties) ในลักษณะแบบ Design-Time ก็เพราะว่าเราไม่จำเป็นต้องไปจดจำค่าใดๆ ขอเพียงแค่ที่พักใจ เอ้ย ทำความเข้าใจ และอาศัยการดูจากโค้ดตัดแปะของตัวเองนั่นก็พอล่ะครับ 5555+ ...


เริ่มต้นการแสดงผลแบบไม่จัดกลุ่ม


การจัดกลุ่มโดยใช้วิธีการลากและวาง ... จากส่วนหัวของแต่ละหลัก (Column Header) เราสามารถคลิ๊กเพื่อทำการจัดเรียงข้อมูลแบบท็อกเกิ้ล (Toggle) คือสลับจากน้อยไปหามาก หรือมากไปหาน้อยด้วยการคลิ๊ก


โปรแกรมย่อยในการจัดรูปแบบของ SharpGrid หรือการทำแพทเทิร์น

' / -----------------------------------------------------------------------------------------------
Sub SetupSGGridCountry()
' / -----------------------------------------------------------------------------------------------
    ' / Initialize grid properties
    ' / การตั้งค่าคุณสมบัติ (Properties) ในแบบ Run Time (สั่งรันโปรแกรมจึงจะเห็นผล)
    ' / เป็นการตั้งค่ามาตรฐานที่เราต้องใช้งานกันเป็นประจำ แบบไม่ต้องมาท่องจำ

    With SGGridData
        ' ============ IMPORTANT ===========
        ' / สำหรับการจัดกลุ่มแบบ Drag & Drop

        .GroupByBoxVisible = True
        .CacheAllRecords = True
        '.GroupByBoxText = "Drag a column header here to group by that column"
        .GroupByBoxText = "ลากส่วนหัวของแต่ละหลักมาวางเพื่อทำการจัดกลุ่ม"
        ' ===================================
        .FitLastColumn = True
        .Appearance = sg3D
        .SpecialMode = sgModeListBox
        .CellsBorderVisible = True
        .AutoResize = sgAutoResizeColumns   ' / ปรับขนาดหลักแบบออโต้
        .GroupIndentation = 225 ' / ระยะการจัดกลุ่มเยื้องมาจากทางซ้าย
       
        .DefaultRowHeight = 390
        .RowHeightMin = 390
        .HeadingColCount = 1
       
        .HeadingGridLinesColor = vbBlack
        .HeadingGridLines = sgGridLineFlat
       
        .EvenOddStyle = sgEvenOddRows
        .ColorOdd = &HEFEFE0
       
        .CellTips = sgCellTipsFloat
        .CellTipsDelay = 400
        .ScrollBarTips = sgScrollTipsVertical
       
        ' / การแสดงผลปกติในตารางกริด
        With .Styles("Normal")
            .BkgStyle = sgCellBkgSolid
            .Font.Name = "Tahoma"
            .Font.Size = 8
            .Padding = 18
        End With
        ' / ส่วนหัวของหลัก (Columns)
        With .Styles("Heading")
            .BackColor = RGB(205, 0, 0)
            .ForeColor = vbWhite
            .Font.Name = "Tahoma"
            .Font.Size = 9
            .Font.Bold = True
            .Padding = 75
        End With
        ' / ส่วนหัวของ Group
        With .Styles("GroupHeader")
            .Font.Size = 9
            .Font.Bold = True
            .BackColor = RGB(241, 239, 226)
            .BkgStyle = sgCellBkgSolid
            .Padding = 30
            .BorderColor = RGB(241, 207, 0)
            .Borders = sgCellBorderBottom
            .BorderSize = 1
        End With
        ' / ส่วนด้านล่างหรือสรุปของ Group
        With .Styles("GroupFooter")
            .Font.Size = 9
            .Font.Name = "Tahoma"
            .ForeColor = vbBlue
            .BackColor = RGB(255, 255, 224)
            .BkgStyle = sgCellBkgSolid
            .Padding = 75
            .BorderColor = RGB(255, 207, 0)
            .Borders = sgCellBorderBottom
            .BorderSize = 50
            .TextAlignment = sgAlignLeftCenter
        End With
       
        With .Styles("Tip")
            .Font.Size = 10
            .Padding = 40
        End With
        ' / แถวที่เราเลือกหรือโฟกัส
        With .Styles("Selection")
            .BackColor = RGB(0, 170, 0)
            .ForeColor = vbWhite
            .BkgStyle = sgCellBkgSolid
        End With
        ' / แถวที่เราไม่ได้โฟกัส
        With .Styles("InactiveSelection")
            .BackColor = RGB(0, 170, 0)
            .ForeColor = vbWhite
            .BkgStyle = sgCellBkgSolid
        End With
   
    End With
End Sub

โปรแกรมย่อยในการแสดงผลข้อมูล ... เรียกได้ว่าเป็นแพทเทิร์นอีกตัว
*** ขอให้สังเกตและทำความเข้าใจ ว่าลักษณะการติดต่อกับตารางข้อมูลจะเทียบได้กับการใช้ DataReader ใน VB.Net ***

' / -----------------------------------------------------------------------------------------------
Sub SGGridCountryBound()
' / -----------------------------------------------------------------------------------------------
   
    ' สร้าง Instance ขึ้นมาใหม่ พร้อมกับตัดการเชื่อมต่อเดิมทิ้ง (หากลืม)
    Set RS = New ADODB.Recordset
    ' / ****************************************** I M P O R T A N T ***************************************
    ' / Create select statement, sample join 2 tables.
    ' / การ Bound Data เมื่อเวลาแสดงผลในแต่ละหลัก (Column) มันจะถูกจัดเรียงตามการชื่อฟิลด์ใน Query
    ' / ย้ำอีกทีว่าหลักจะถูกจัดเรียงตามชื่อฟิลด์

    Statement = " SELECT Countries.CountryPK, Countries.Flag, Countries.A2, Countries.Country, Countries.Capital, " & _
                            " Countries.Population, Zones.ZoneName " & _
                            " FROM Countries INNER JOIN Zones ON Countries.ZoneFK = Zones.ZonePK " & _
                            " ORDER BY Countries.A2 "

    ' ============ IMPORTANT ==========
    SGGridData.DataMode = sgBound
    ' ==================================
    RS.CursorLocation = adUseClient
    ' / กำหนดการอ่านข้อมูลอย่างเดียว (เทียบได้กับการใช้ DataReader ใน VB.Net)
    RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
    ' ======================= ผูกเข้ากับตาราง RecordSet =========================
    Set SGGridData.DataSource = RS
   
    With SGGridData
        ' / หลัก 0 นี่คือหลักที่แสดงหมายเลขแถวครับ
        .Rows.At(0).Height = 420
        ' / คลิ๊กส่วนหัวให้สามารถจัดเรียงข้อมูลแบบน้อยไปหามาก และคลิ๊กอีกทีจะเรียงจากมากไปหาน้อย
        .ColumnClickSort = True
        ' / หลัก 0 ที่แสดงหมายเลขแถวจะถูกซ่อน ไม่ให้แสดงผล
        .Columns(0).Hidden = True
        ' / ไม่แสดงผลลำดับที่
        .RowNumbering = False
        ' /
        .Columns(1).Caption = "CountryPK"
        ' / ซ่อนหลัก Primary Key (หลัก 1 เพราะหลัก 0 คือหลักแสดงผลลำดับแถว)
        .Columns(1).Hidden = True
        '
        .Columns(2).Caption = "ธงชาติ"
        .Columns(2).Width = 800
        .Columns(3).Caption = "ชื่อย่อ"
        .Columns(3).Width = 800
        .Columns(4).Caption = "ชื่อประเทศ"
        .Columns(4).Width = 2000
        .Columns(5).Caption = "ชื่อเมืองหลวง"
        .Columns(5).Width = 1800
        .Columns(6).Caption = "จำนวนประชากร"
        .Columns(6).Width = 1600
        .Columns(6).Style.TextAlignment = sgAlignRightCenter
        .Columns(6).DataType = sgtCurrency
        .Columns(6).Style.Format = "#,##0.00"
        .Columns(7).Caption = "โซน"
    End With
    ' / ต้องตัดการเชื่อมต่อ RecordSet ทุกครั้ง
    RS.Close:   Set RS = Nothing
End Sub

โค้ดในส่วนเหตุการณ์ก่อนเกิดการเปลี่ยนแปลงในการลากและวาง
' / -----------------------------------------------------------------------------------------------
' / เหตุการณ์ที่เกิดก่อนการเปลี่ยนแปลงในการจัดกลุ่มในแต่ละหลัก (Column)

Private Sub SGGridData_BeforeGroupChange( _
    ByVal Operation As DDSharpGridOLEDB2U.sgGroupOperation, _
    ByVal GroupOrColIndex As Long, _
    ByVal NewIndex As Long, _
    SortOrder As DDSharpGridOLEDB2U.sgSortOrder, _
    SortType As DDSharpGridOLEDB2U.sgSortType, _
    ShowFooter As Boolean, _
    Cancel As Boolean _
    )
' / -----------------------------------------------------------------------------------------------
    If Operation = sgGroupRemove Then
        SGGridData.Columns(SGGridData.Groups(GroupOrColIndex).GroupingColumn).Hidden = False
    ElseIf Operation = sgGroupAdd Then
        SGGridData.Columns(GroupOrColIndex).Hidden = True
    End If
End Sub

โค้ดในการส่วนของการนำข้อมูลไปใช้งาน
' / -----------------------------------------------------------------------------------------------
' / แสดง Primary Key ที่ถูกซ่อนเอาไว้ เพื่อนำไปใช้งาน

Private Sub SGGridData_DblClick()
' / -----------------------------------------------------------------------------------------------
    ' / หลัก 1 คือ Primary Key ที่เรานำไปซ่อนไว้ไม่ให้ Users มองเห็น
    SGGridData.Col = 1
    ' / หากดับเบิ้ลคลิ๊กเมาส์แล้ว เจอแถวที่แสดงผลแบบกลุ่ม ก็ให้ออกไปจากโปรแกรมย่อย
    If Not IsNumeric(SGGridData.Text) Then Exit Sub
   
    MsgBox "CountryPK = " & Val(SGGridData.Text)
End Sub

Conslusion: ด้วยวิธีการจัดกลุ่มสำหรับ SharpGrid ในแบบลากแล้ววาง (Drag & Drop) จะเห็นได้เลยว่ามีความง่ายดายมาก แต่คุณทราบหรือไม่ว่าสำหรับ End Users ทั่วไป กลับทำให้เขา(หรือเธอ) เข้าใจในวิธีการใช้งานโปรแกรมของเรายากขึ้น แถมจะไม่กล้าใช้อีกน่ะซิครับ ต้องมาเสียเวลาในการฝึกอบรมกันอีกล่ะ ทางออกจะอยู่ที่ภาพทางด้านล่างนี้ เพราะเราไม่จำเป็นต้องจัดกลุ่มไปทุกๆคอลัมน์ยังไงล่ะข่ะรับกระผม


ดาวน์โหลดชุดติดตั้ง SharpGrid ได้ที่นี่ (เฉพาะสมาชิกเท่านั้น)

ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่

คู่มือ SharpGrid 2.0

บันทึกการเข้า
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

ออฟไลน์ naien

  • Newbie
  • *
  • กระทู้: 36
ขอบคุณมากครับ

บันทึกการเข้า

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
ขอบพระคุณมากครับผม.

บันทึกการเข้า

ออฟไลน์ โจ้

  • Newbie
  • *
  • กระทู้: 21
ขอบคุณครับ  :D

บันทึกการเข้า