ผู้เขียน หัวข้อ: [VB.Net] ฟรีโค้ดตัวอย่างการสร้างแบบประเมินผลพนักงานด้วย DataGridX DotNetBar  (อ่าน 171 ครั้ง)

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
โค้ดตัวอย่างการสร้างแบบประเมินผล (Evaluation) พนักงานด้วย DataGridX DotNetBar ในแบบลักษณะไดนามิค ... แอดมินเคยกล่าวซ้ำๆซากๆไปหลายรอบแล้วว่า เหตุใดแอดมินถึงชื่นชอบหรือถนัดในการเขียนโปรแกรมแบบ Run Time มากกว่าการลากวัตถุมาวางแปะ แล้วกำหนดคุณสมบัติโน่นนั่นนี่ หรือที่เราเรียกว่า Design Time โค้ดตัวอย่างนี้จะทำให้หลายๆท่านได้เห็นคำตอบที่บรรลุ "ทางทำ" กันจะๆสักที จะเห็นได้ชัดเจนเลยว่าความยืดหยุ่นในการพัฒนาโปรแกรมนั้นมันมีอยู่สูงมากกว่ากันเยอะ ...

ในลักษณะงานจริง ส่วนใหญ่ที่รับข้อมูลมาจากลูกค้าก็มักจะเป็น Text File, CSV, Excel หรือหลังๆนี่ก็เป็น XML เพราะลูกค้า หรือผู้ว่าจ้างเขาจะไม่ยอมให้ก้อนฐานข้อมูลมาอยู่แล้วข่ะรับ กลัวรู้ฐานเงินเดือนพนักงานเขา 5555+ ... รวมไปถึงในสาย IT Support ของแต่ละองค์กร ฝ่ายบุคคลเขาก็ให้ข้อมูลเรามาแค่บางส่วนเท่านั้นเอง ที่เหลือก็ต้องมานั่งโซ้ยไล่เรียงออกแบบกันอีกที ...

โปรเจคนี้แอดมินเลือกใช้ DataGridX ของค่าย DotNetBar ซึ่งก็ใช้โค้ดคำสั่งเดียวกันกับ DataGridView ของเล็กนิ่มนั่นแหละครับ แต่มันแฝงความง่ายในการอินพุตข้อมูลที่ดีกว่า ก็เลยเลือกเอาใช้งานจริงเลยข่ะรับกระผม ดาวน์โหลด DotNetBar จากเว็บไซต์ผู้ผลิต


Sample Program


Reference


ฟอร์มหลักในการสร้างหัวข้อการประเมินแบบไดนามิค


ฟอร์มรองในการสร้างแบบประเมินผลพนักงาน


การดึงข้อมูลตัวอย่างจากไฟล์ XML (eXtensible Markup Langauge)


การส่งออกข้อมูลไปยังไฟล์ MS Excel เพื่อทำการประมวลผลทางด้านสถิติต่อไป

โค้ดของฟอร์มหลัก (frmMainEvaluation.vb)

โค๊ด: [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)
' / Facebook: https://www.facebook.com/commonindy (For International)
' / Purpose: Demo sample code for Evaluation of Employee with @Runtime.
' / Microsoft Visual Basic .NET (2010) + DotNetBar Win Form 12.8.0.20
' / --------------------------------------------------------------------------------
Imports DevComponents.DotNetBar
Imports DevComponents.DotNetBar.Controls    '// สำหรับการกำหนดคุณสมบัติของเซลล์

Public Class frmMainEvaluation
    '// Sample Data
    Private Sub FillDataSample()
        Dim row As String() = New String() {"ข้อที่ 1", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 2", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 3", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 4", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 5", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 6", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 7", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 8", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 9", "10"}
        dgvData.Rows.Add(row)
        row = New String() {"ข้อที่ 10", "10"}
        dgvData.Rows.Add(row)
    End Sub

    ' / --------------------------------------------------------------------------------
    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        InitilaizeGrid()
        'FillDataSample()
    End Sub

    ' / --------------------------------------------------------------------------------
    Private Sub InitilaizeGrid()
        Dim Column1 As New DataGridViewTextBoxColumn()
        Dim Column2 As New DataGridViewIntegerInputColumn
        With dgvData
            With Column1
                .Name = "Name"
                .HeaderText = "หัวข้อการประเมิน"
                .Width = dgvData.Width \ 2
            End With
            With Column2
                .Name = "Point"
                .HeaderText = "ค่าคะแนน"
                .HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomRight
                .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                '// No auto Increment/Decrement
                .Increment = 0
                '.DefaultCellStyle.Format = "n2"
                .Width = dgvData.Width \ 2 - 60
            End With
            With dgvData
                .Columns.Add(Column1)
                .Columns.Add(Column2)
            End With
            '// Sample coding with Run-Time
            With dgvData
                '.RowHeadersVisible = False
                .AllowUserToAddRows = True
                .AllowUserToDeleteRows = True
                .AllowUserToResizeColumns = True
                .AllowUserToResizeRows = True
                .SelectionMode = DataGridViewSelectionMode.CellSelect
                .MultiSelect = False
                '// Data rows
                .Font = New Font("Tahoma", 9)
                .RowTemplate.MinimumHeight = 20
                .RowTemplate.Height = 26
                '// Column Header
                .ColumnHeadersHeight = 30
                .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
                '// Header Own Style
                With .ColumnHeadersDefaultCellStyle
                    .BackColor = Color.Navy
                    .ForeColor = Color.Black
                    .Font = New Font("Tahoma", 9, FontStyle.Bold)
                End With
            End With
        End With
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
        Application.Exit()
    End Sub

    Private Sub ButtonX1_Click(sender As System.Object, e As System.EventArgs) Handles ButtonX1.Click
        frmSubEvaluation.Show()
    End Sub

    Private Sub ButtonX2_Click(sender As System.Object, e As System.EventArgs) Handles ButtonX2.Click
        Me.Dispose()
    End Sub

    Private Sub frmMainEvaluation_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.Delete
                Call RemoveRow()
        End Select
    End Sub

    ' / --------------------------------------------------------------------------------
    ' / Remove selected row
    Private Sub RemoveRow()
        If dgvData.RowCount = 0 Then Exit Sub
        dgvData.Rows.Remove(dgvData.CurrentRow)
        dgvData.Refresh()
    End Sub

    Private Sub frmMainEvaluation_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        '// You can press any key on form
        Me.KeyPreview = True
    End Sub

    Private Sub dgvData_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit
        ' ส่งคีย์การกดลูกศรบนและขวา เพื่อเลื่อนตำแหน่งในการคีย์ข้อมูล
        SendKeys.Send("{UP}{RIGHT}")
    End Sub

    ' / --------------------------------------------------------------------------------
    '// โหลดข้อมูลตัวอย่าง
    Private Sub btnLoadData_Click(sender As System.Object, e As System.EventArgs) Handles btnLoadData.Click
        '// Clear all rows
        dgvData.Rows.Clear()
        '// Fill sample data into DataGridView
        FillDataSample()
    End Sub
End Class


โค้ดฟอร์มรองหรือแบบประเมินผลพนักงาน (frmSubEvaluation.vb)

โค๊ด: [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)
' / Facebook: https://www.facebook.com/commonindy (For International)
' / Purpose: Demo sample code for Evaluation of Employee with @Runtime.
' / Microsoft Visual Basic .NET (2010) + DotNetBar Win Form 12.8.0.20
' / --------------------------------------------------------------------------------
Imports System.Data
Imports DevComponents.DotNetBar
Imports DevComponents.DotNetBar.Controls

Imports Excel = Microsoft.Office.Interop.Excel

Public Class frmSubEvaluation
    ' / --------------------------------------------------------------------------------
    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        InitailizeGrid()
        'FillDataSample()
        'UpdateRow()
    End Sub

    ' / --------------------------------------------------------------------------------
    Private Sub InitailizeGrid()
        dgvData.Columns.Clear()
        '//
        Dim ColEmployeeName As New DataGridViewTextBoxColumn()
        '// ค่าคะแนน กำหนดเป็นแบบชนิดตัวเลขจำนวนเต็ม หากอยากได้ค่าแบบจุดทศนิยม ให้เลือก DoubleInput
        Dim ColPoint As New DataGridViewIntegerInputColumn
        '// Add new Columns
        dgvData.Columns.Add(ColEmployeeName)
        With ColEmployeeName
            .Name = "EmployeeName"
            .HeaderText = "ชื่อพนักงาน"
        End With
        Dim nRow As Integer
        '// Sum of points.
        Dim SumPoint As Double
        '// Refer to DataGridView in Form1 and loop for create dynamic column. (Evaluation topics)
        For nRow = 0 To frmMainEvaluation.dgvData.Rows.Count - 2
            ColPoint = New DataGridViewIntegerInputColumn
            dgvData.Columns.Add(ColPoint)
            With ColPoint
                .Name = "ColPoint" & nRow
                .HeaderText = frmMainEvaluation.dgvData.Rows(nRow).Cells(0).Value & vbCrLf & "(" & _
                    frmMainEvaluation.dgvData.Rows(nRow).Cells(1).Value & ")"
                .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                .AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
                '// ผลรวมคะแนนทั้งหมด
                SumPoint = SumPoint + frmMainEvaluation.dgvData.Rows(nRow).Cells(1).Value
                '// ไม่ให้กดลูกศรขึ้นลงเพื่อเพิ่มค่าหรือลดค่า
                .Increment = 0
                '// ค่าต่ำสุด
                .MinValue = 0
                '// ค่าสูงสุดที่จะป้อนลงในแต่ละเซลล์ได้ โดยอาศัยค่าคะแนนที่เรากำหนดจากฟอร์ม Main
                .MaxValue = frmMainEvaluation.dgvData.Rows(nRow).Cells(1).Value
            End With
        Next
        '// Last column - Summary
        ColPoint = New DataGridViewIntegerInputColumn
        dgvData.Columns.Add(ColPoint)
        With ColPoint
            .Name = "Summary"
            '// ค่าคะแนนรวม SumPoint มาจากการวนรอบส่วนหัว (โค้ดอยู่ด้านบน)
            .HeaderText = "คะแนนรวม" & vbCrLf & "(" & SumPoint.ToString & ")"
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            With .DefaultCellStyle
                .Alignment = DataGridViewContentAlignment.MiddleCenter
                .Font = New Font("Tahoma", 10, FontStyle.Bold)
                .ForeColor = Color.Blue
            End With
            .AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            '// หลักสุดท้ายเป็นหลักรวมคะแนน จึงกำหนดไม่ให้มีการแก้ไขได้
            .ReadOnly = True
        End With

        '// Sample coding with Run-Time
        With dgvData
            .AllowUserToAddRows = True
            .AllowUserToDeleteRows = True
            .AllowUserToResizeColumns = True
            .AllowUserToResizeRows = True
            .SelectionMode = DataGridViewSelectionMode.CellSelect
            .MultiSelect = False
            '// Data rows
            .Font = New Font("Tahoma", 9)
            .RowTemplate.MinimumHeight = 20
            .RowTemplate.Height = 26
            '// Column Header
            .ColumnHeadersHeight = 50
            .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
            '// Header Own Style
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
            End With
        End With
    End Sub

    ' / --------------------------------------------------------------------------------
    '// ทุกๆครั้งที่มีการแก้ไขในแต่ละเซลล์ ให้ทำการ Update ค่าในแต่ละแถว
    Private Sub UpdateRow()
        Dim MaxCount As Integer = dgvData.Columns.Count - 1
        Dim nRow As Integer = 0
        Dim nCol As Integer
        Dim Sum As Double

        For nRow = 0 To dgvData.Rows.Count - 1
            For nCol = 1 To dgvData.Columns.Count - 2
                Sum = Sum + dgvData.Rows(nRow).Cells(nCol).Value
            Next nCol
            dgvData.Rows(nRow).Cells(MaxCount).Value = Sum
            Sum = 0
        Next nRow
    End Sub

    Private Sub dgvData_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit
        '// Update point for each row.
        UpdateRow()
        ' Auto Send key Up & Right
        SendKeys.Send("{UP}{RIGHT}")
    End Sub

    ' / ------------------------------------------------------------------
    '// คืนหน่วยความจำกลับคืนสู่ระบบ
    Private Sub ReleaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            '// GC = Garbage Collection
            GC.Collect()
        End Try
    End Sub

    ' / ------------------------------------------------------------------
    ' / Get my project path
    ' / AppPath = C:\My Project\bin\debug
    ' / Replace "\bin\debug" with "\"
    ' / Return : C:\My Project\
    Function MyPath(AppPath As String) As String
        AppPath = AppPath.ToLower()
        MyPath = AppPath.Replace("\bin\debug", "\")
    End Function

    Private Sub frmSubEvaluation_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        dgvData.Dispose()
        Me.Dispose()
        Me.Close()
    End Sub

    Private Sub ButtonX2_Click(sender As System.Object, e As System.EventArgs) Handles ButtonX2.Click
        Me.Dispose()
    End Sub

    ' / --------------------------------------------------------------------------------
    '// Load XML File by get the value from a specific node.
    Private Sub btnLoadData_Click(sender As System.Object, e As System.EventArgs) Handles btnLoadData.Click
        dgvData.Rows.Clear()
        Dim strPath As String = MyPath(Application.StartupPath) & "employee.xml"
        Dim doc = XDocument.Load(strPath)
        '// Get the value from a specific node in an XML file
        '// employee --> empdata --> empname
        Dim members = From m In doc.Element("employee").Elements("empdata")
        Select employeename = m.Element("empname").Value
        For Each member In members
            dgvData.Rows.Add(member)
        Next
        '// Update point each row
        UpdateRow()
        '//
        dgvData.Focus()
        '// Control + Home and Right
        SendKeys.Send("^{HOME}{RIGHT}")
    End Sub

    ' / --------------------------------------------------------------------------------
    '// Export data from DataGridX to MS Excel file.
    Sub ExportExcel()
        If dgvData.RowCount = Nothing Then
            Dim ExportIntoExcelSheet As String = String.Empty
            MessageBox.Show(ExportIntoExcelSheet & vbCrLf & "Please retrieve data in datagridview", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If

        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor

        Dim MaxRow As Integer, MaxCol As Short
        Dim nRow As Integer, nCol As Short
        Dim xlsApp As New Excel.Application
        Dim xlsWorkBook As Excel.Workbook = xlsApp.Workbooks.Add
        Dim xlsWorkSheet As Excel.Worksheet = CType(xlsWorkBook.Worksheets(1), Excel.Worksheet)
        '//
        Try
            xlsApp.Visible = True
            '
            MaxRow = dgvData.RowCount
            MaxCol = dgvData.Columns.Count - 1
            With xlsWorkSheet
                .Cells.Select()
                .Cells.Delete()
                '// Header
                For nCol = 0 To MaxCol
                    .Cells(1, nCol + 1).Value = dgvData.Columns(nCol).HeaderText
                Next
                '//
                For nRow = 0 To MaxRow - 1
                    For nCol = 0 To MaxCol
                        .Cells(nRow + 2, nCol + 1).value = dgvData.Rows(nRow).Cells(nCol).Value
                    Next nCol
                Next nRow
                .Rows("1:1").Font.FontStyle = "Bold"
                .Rows("1:1").Font.Size = 11

                .Cells.Columns.AutoFit()
                .Cells.Select()
                .Cells.EntireColumn.AutoFit()
                .Cells(1, 1).Select()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            'RELEASE ALLOACTED RESOURCES
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            '// Release memory.
            ReleaseObject(xlsApp)
            ReleaseObject(xlsWorkBook)
            ReleaseObject(xlsWorkSheet)
        End Try
        xlsApp = Nothing
    End Sub

    Private Sub btnExportExcel_Click(sender As System.Object, e As System.EventArgs) Handles btnExportExcel.Click
        ExportExcel()
    End Sub
End Class

ดาวน์โหลด DotNetBar จากเว็บไซต์ผู้ผลิต

ดาวน์โหลดโค้ดฉบับ Visual Basic .Net (2010) ได้ที่นี่

ดาวน์โหลด DotNetBar for Windows Forms 12.8.0.20 (เฉพาะสมาชิกเท่านั้น)

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

ออฟไลน์ โจ้

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

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

ออฟไลน์ Mr.Den

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

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