ผู้เขียน หัวข้อ: [VB6] แจกโค้ดการใช้งาน SharpGrid แบบผูกข้อมูล (Bound Data Control) - ปฐมบท  (อ่าน 339 ครั้ง)

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
SharpGrid ActiveX Control เป็นตารางกริดสำหรับกลุ่มตระกูล Visual Studio 1998 ที่มีความเร็วในการแสดงผล และมีประสิทธิภาพสูงมาก (หากควบคุมมันเป็น) ...

ฟรีโค้ดของจริงนี้จะเป็นการนำเสนอ การใช้งาน SharpGrid ในลักษณะของ Bound Data Control หรือการผูกแหล่งข้อมูลเข้ากับตัวตารางกริด แต่เป็นลักษณะแบบ Run-Time โดยไม่ใช้วิธีการที่จับลากมาวางแปะๆเท่านั้นน่ะครับ ซึ่งแอดมินเชื่อว่าหลายๆคน อาจจะไม่ค่อยคุ้นเคยกันมากนักกับวิธีการแบบนี้ แต่เชื่อแอดมินเถอะครับ ด้วยการออกแบบ และเขียนโค้ดในลักษณะนี้ มันจะมีความยืดหยุ่นที่สูงมากกว่า ยิ่งหากเราต้องทำงานในหลายๆโปรเจค ก็เรียกได้ว่าแค่ก็อปไปวางแปะได้เลย (หากเข้าใจแจ่มแจ้งน่ะข่ะรับ) ... หลักการทำงานของมัน พี่น้องทั้งหลายสามารถนำไปเรียนรู้ หรือ ทำความเข้าใจกับ VB.Net ได้สบายมากเลยครับ ... ขอบอก


การ Bound Data ในแบบ Run-Time


เรียกใช้งาน SharpGrid ... Project --> Components ... (ให้เลือกเป็นแบบ Unicode นะครับ)


คลิ๊กเมาส์ขวาที่ตัว SharpGrid แล้วเลือก Properties เพื่อเตรียมปรับคุณสมบัติแบบ Design-Time


การปรับคุณสมบัติของ SharpGrid ในแบบ Design-Time ... แต่แอดมินเลือกที่จะใช้วิธีแบบ Run-Time หรือการเขียนโค้ดแทนข่ะรับ

หลักการที่สำคัญสำหรับการ Bound Data ใน SharpGrid
แต่ละหลักในตารางกริด จะแสดงผลตามลำดับของการจัดเรียงฟิลด์ข้อมูลในคิวรี่ จะข้ามลำดับกันไปไม่ได้ ยกเว้นหากไม่ต้องการแสดงผล ก็สั่งให้หลักนั้นซ่อนไว้ Hidden = True
โค๊ด: [Select]
        ' / ย้ำอีกทีว่าหลักจะถูกจัดเรียงตามชื่อฟิลด์
        Statement = " SELECT Countries.CountryPK, Countries.A2, Countries.Country, Countries.Capital, " & _
                                " Countries.Population, Zones.ZoneName " & _
                                " FROM Countries INNER JOIN Zones ON Countries.ZoneFK = Zones.ZonePK " & _
                                " ORDER BY Countries.A2 "
การจัดเรียงฟิลด์ CountryPK, A2, Country, Capital, Population และ ZoneName

มาดูโค้ดในฟอร์มหลัก ... frmSharpGridBoundData.frm

โค๊ด: [Select]
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand only)
' / Facebook: https://www.facebook.com/commonindy (For International)
' / Purpose : Sample to use SharpGrid ActiveX for Bound Data Control.
' / Microsoft Visual Basic 6.0 Service Pack 6
' / -----------------------------------------------------------------------------------------------
Option Explicit

' / -----------------------------------------------------------------------------------------------
' / การค้นหาข้อมูล
Private Sub cmdSearch_Click()
    ' / ตัดคำสงวน (Reserved Word) ที่มีปัญหากับฐานข้อมูลออกไป
    txtSearch.Text = Replace(txtSearch.Text, "'", "")
    txtSearch.Text = Replace(txtSearch.Text, "%", "")
    txtSearch.Text = Replace(txtSearch.Text, "*", "")
    If Trim(txtSearch.Text) = "" Or Len(txtSearch.Text) = 0 Then Exit Sub
   
    Call SetupSGGridCountry
    Call SGGridCountryBound(True)
   
End Sub

' / -----------------------------------------------------------------------------------------------
Private Sub Form_Load()
' / -----------------------------------------------------------------------------------------------
On Error GoTo ErrorHandler
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
    Call OpenDataBase
    txtSearch.Text = ""

    ' / Initialize Sharp Grid
    Call SetupSGGridCountry
    Call SGGridCountryBound(False)
   
ExitProc:
    Exit Sub
   
ErrorHandler:
    MsgBox "Error : " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
    Resume ExitProc

End Sub

Private Sub Form_Resize()
    On Error Resume Next
   
    If Me.ScaleWidth < 120 Or Me.ScaleHeight < 120 Then Exit Sub
    fraData.Height = Me.ScaleHeight - 30
    fraData.Move 15, 0, Me.ScaleWidth - 15
    SGGridData.Move 15, 615, fraData.Width - (SGGridData.Left) - 15, fraData.Height - 690
End Sub

Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
    If Dir$(App.Path & "\*.tmp") <> "" Then
        Kill App.Path & "\*.tmp"
    End If
    '
    Call CloseDataBase
    End
End Sub

' / -----------------------------------------------------------------------------------------------
Sub SetupSGGridCountry()
' / -----------------------------------------------------------------------------------------------
   ' / Initialize grid properties
   ' / การตั้งค่าคุณสมบัติ (Properties) ในแบบ Run Time (สั่งรันโปรแกรมจึงจะเห็นผล)
   ' / เป็นการตั้งค่ามาตรฐานที่เราต้องใช้งานกันเป็นประจำ
   With SGGridData
        .GroupByBoxVisible = False
        .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
       
        .CacheAllRecords = True
        .ColumnClickSort = True
       
        ' / การแสดงผลปกติในตารางกริด
        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
   
    ' ================ Setup SGGrid ====================
    ' / จัดระเบียบในแต่ละหลัก (Column)
    With SGGridData
        ' Start Columns 1
        With .Columns.Add("Column1")
            .Caption = "CountryPK"
            .Width = 0
            .Style.TextAlignment = sgAlignLeftCenter
            .AllowSizing = False
            .Hidden = True
        End With
        ' / ตั้งชื่อหลัก
        With .Columns.Add("Column2")
            ' / ป้ายบอก
            .Caption = "A2"
            ' / การจัดตำแหน่งในแต่ละแถว
            .Style.TextAlignment = sgAlignLeftCenter
            ' / จัดรูปแบบส่วนหัว
            .HeadingStyle.TextAlignment = sgAlignLeftCenter
            ' / อนุญาตให้ปรับขนาดหลัก
            .AllowSizing = True
            ' / กำหนดความหว้าง
            .Width = 800
        End With
        ' 3
        With .Columns.Add("Column3")
            .Caption = "Country"
            .Style.TextAlignment = sgAlignLeftCenter
            .HeadingStyle.TextAlignment = sgAlignLeftCenter
            .AllowSizing = True
            .Width = 2000
        End With
        ' 4
        With .Columns.Add("Column4")
            .Caption = "Capital"
            .Style.TextAlignment = sgAlignLeftCenter
            .HeadingStyle.TextAlignment = sgAlignLeftCenter
            .AllowSizing = True
            .Width = 1800
        End With
        ' 5
        With .Columns.Add("Column5")
            .Caption = "Population"
            .Style.TextAlignment = sgAlignRightCenter
            .HeadingStyle.TextAlignment = sgAlignRightCenter
            .DataType = sgtCurrency
            .Style.Format = "#,##0.00"
            .AllowSizing = True
            .Width = 1600
        End With
        ' 6
        With .Columns.Add("Column6")
            .Caption = "Zone"
            .Style.TextAlignment = sgAlignLeftCenter
            .HeadingStyle.TextAlignment = sgAlignLeftCenter
            .AllowSizing = False
        End With
    End With
' / -----------------------------------------------------------------------------------------------
End Sub

' / -----------------------------------------------------------------------------------------------
' / แสดง Primary Key ที่ถูกซ่อนเอาไว้ เพื่อนำไปใช้งาน
Private Sub SGGridData_DblClick()
' / -----------------------------------------------------------------------------------------------
    SGGridData.Col = 1
    MsgBox "CountryPK = " & Val(SGGridData.Text)
End Sub

' / -----------------------------------------------------------------------------------------------
' / โปรแกรมย่อยที่รวบยอดเอามารวมกัน กรณีที่ค้นหาข้อมูล หรือจะแสดงผลข้อมูลทั้งหมดออกมา
' / หาก blnSearch = True คือการค้นหาข้อมูล
' / หาก blnSearch = False คือการแสดงผลข้อมูลใหม่ทั้งหมด
Sub SGGridCountryBound(Optional blnSearch As Boolean = False)
' / กำหนด False ให้เป็น Option หรือการแสดงผลข้อมูลใหม่ทั้งหมด
' / -----------------------------------------------------------------------------------------------
   
    ' สร้าง 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
    If blnSearch Then
        Statement = " SELECT Countries.CountryPK, Countries.A2, Countries.Country, Countries.Capital, " & _
                                " Countries.Population, Zones.ZoneName " & _
                                " FROM Countries INNER JOIN Zones ON Countries.ZoneFK = Zones.ZonePK " & _
                                " WHERE " & _
                                " ([A2] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
                                " [Country] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
                                " [Capital] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
                                " [ZoneName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & ")" & _
                                " ORDER BY Countries.A2 "
    Else
        ' / ย้ำอีกทีว่าหลักจะถูกจัดเรียงตามชื่อฟิลด์
        Statement = " SELECT Countries.CountryPK, Countries.A2, Countries.Country, Countries.Capital, " & _
                                " Countries.Population, Zones.ZoneName " & _
                                " FROM Countries INNER JOIN Zones ON Countries.ZoneFK = Zones.ZonePK " & _
                                " ORDER BY Countries.A2 "

    End If
   
    ' ============ IMPORTANT ==========
    SGGridData.DataMode = sgBound
    ' ==================================
    RS.CursorLocation = adUseClient
    ' / กำหนดการอ่านข้อมูลอย่างเดียว
    RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
    ' ======================= ผูกเข้ากับตาราง RecordSet =========================
    Set SGGridData.DataSource = RS
    ' =====================================================================
    SGGridData.DataRowCount = RS.RecordCount
    ' / แสดงผลจำนวนรายการ
    If RS.RecordCount >= 0 Then
        lblSearch.Caption = "[จำนวน : " & RS.RecordCount & " รายการ.]"
    Else
        lblSearch.Caption = "[จำนวน : 0" & " รายการ.]"
    End If
    '
    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 = 2000
        .Columns(4).Caption = "ชื่อเมืองหลวง"
        .Columns(4).Width = 1800
        .Columns(5).Caption = "จำนวนประชากร"
        .Columns(5).Width = 1600
        .Columns(5).Style.TextAlignment = sgAlignRightCenter
        .Columns(5).DataType = sgtCurrency
        .Columns(5).Style.Format = "#,##0.00"
        .Columns(6).Caption = "โซน"
    End With
   
    ' / ต้องตัดการเชื่อมต่อ RecordSet ทุกครั้ง
    RS.Close:   Set RS = Nothing
End Sub

' / -----------------------------------------------------------------------------------------------
' / เหตุการณ์คลิ๊กปุ่มรีเฟรช จะทำการแสดงผลข้อมูลใหม่ทั้งหมด
Private Sub cmdRefresh_Click()
' / -----------------------------------------------------------------------------------------------
    Call SetupSGGridCountry
    Call SGGridCountryBound(False)
    With SGGridData
        .LeftCol = 0
        .SetFocus
        Sendkeys "{RIGHT}"
    End With
    txtSearch.Text = ""
End Sub

Private Sub txtSearch_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDown Then Sendkeys "{TAB}"
    If KeyCode = vbKeyUp Then Sendkeys "+{TAB}"
End Sub

Private Sub txtSearch_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        Call cmdSearch_Click
        KeyAscii = 0
    End If
End Sub

Private Sub cmdRefresh_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDown Or KeyCode = vbKeyRight Then Sendkeys "{TAB}"
    If KeyCode = vbKeyUp Or KeyCode = vbKeyLeft Then Sendkeys "+{TAB}"
End Sub

โค้ดในส่วนของโมดูลทำมาหากิน modDataBase.bas

โค๊ด: [Select]
Option Explicit

Global ConnDB As New ADODB.Connection
Global RS As New ADODB.Recordset    ' / RecordSet หลัก
Global DS As New ADODB.Recordset    ' / RecordSet สำรอง
'Global RstData As New ADODB.Recordset   ' / ใช้ในการพิมพ์รายงาน
Global Statement As String
'Global SQLStmt As String

' / -----------------------------------------------------------------------------------------------
Public Sub OpenDataBase()
On Error GoTo Err_Handler
Dim DB_File As String
Dim CnStr As String
    DB_File = App.Path
    If Right$(DB_File, 1) <> "\" Then DB_File = DB_File & "\"
    DB_File = DB_File & "Countries.MDB"
    ' Open a connection.
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & DB_File & ";" & _
        "Persist Security Info=False"
        '" Jet OLEDB:Database Password=" & "password" & ";" '& _
        '" Engine Type=5;"
    ConnDB.Open
    Exit Sub
Err_Handler:
    MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
    End
End Sub

Public Sub CloseDataBase()
    ' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่
    If ConnDB.State = adStateOpen Then
        ConnDB.Close
        Set ConnDB = Nothing
    End If
End Sub

' / -----------------------------------------------------------------------------------------------
' / ฟังค์ชั่นแก้ไขในการ SendKeys ซึ่งใน Windows 8+ 64 บิท จะมีปัญหา
Public Sub Sendkeys(Text As String, Optional Wait As Boolean = False)
    Dim WshShell As Object
    Set WshShell = CreateObject("Wscript.shell")
    WshShell.Sendkeys Text, Wait
    Set WshShell = Nothing
End Sub

Conslusion: อย่าเพียงแต่ลอกโค้ดไปกันน่ะครับ ต้องพยายามทำความเข้าใจในแต่ละชุดแถวคำสั่งที่สำคัญเอาไว้ให้ดีด้วย ซึ่งผมได้เขียนคอมเมนท์ในส่วนสำคัญๆเอาไว้ให้ได้อ่านกันในโค้ดนั่นแหละครับ

รอบหน้าเราจะมาว่ากันต่อเรื่องการจัดกลุ่ม

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

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


คู่มือ SharpGrid 2.0

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

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
ขอบพระคุณอย่างสูงคร๊าบ.. 8)

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

ออฟไลน์ โจ้

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

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