ผู้เขียน หัวข้อ: [VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control  (อ่าน 199 ครั้ง)

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
[VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control

จากตอนที่แล้วเป็น การนำข้อมูลจาก Excel เข้าสู่ DataGridView แต่เป็นแบบ Bound Control คือการผูกคอนโทรล (Bound Control) เข้ากับแหล่งจ่ายข้อมูล (Data Source) แน่นอนครับจะง่ายมาก และมีข้อดีคือสามารถแสดงผลข้อมูลได้อย่างรวดเร็ว แต่ยังมีข้อจำกัดอีกหลายประการ สำหรับตอนนี้จะเป็นการใช้งานแบบ Unbound Control เพื่อลองเปรียบเทียบกันดูน่ะครับ ...

มารู้จักกับคำว่า Bound และ UnBound Control

Bound Control คือ การผูก (Bound) ตารางข้อมูลเข้ากับพวก Component หรือ Control ต่างๆ ... กรณีที่นำมาใช้แสดงผลลงในตารางกริด มันจะอ่านค่าฟิลด์ต่างๆ เพื่อแสดงผลในแต่ละหลัก เรียงตามลำดับจากฟิลด์ต่างๆที่ได้ทำการ Query ไว้ และต้องแสดงทุกๆฟิลด์ออกมาทั้งหมด ... มีข้อดี คือ ทำงานได้เร็ว มักนำไปแสดงผลข้อมูลอย่างเดียว

UnBound Control ก็จะไม่มีการผูก (Unbound) ตารางข้อมูลใดๆเข้ากับ Component หรือ Control ... การนำไปใช้ในตารางกริด ไม่จำเป็นต้องแสดงผลออกมาทุกฟิลด์ และ จะเอาตัวไหนมาแสดงในหลักใดๆก่อนหลังก็ได้ ... มีข้อดี คือ ยืดหยุ่นมากกว่า มักใช้กับปริมาณข้อมูลที่ไม่เยอะมาก เพื่อเข้าไปแก้ไขข้อมูลตารางกริด หรือเกิดการคำนวณในแต่ละเซลล์


ตัวอย่างข้อมูลจาก MS Excel โดยเก็บเพียงชื่อนักเรียน และคะแนน เราจะทำการส่งค่าทั้งหมดไปไว้ที่ DataGridView และให้เกิดการคำนวณหาเกรดออกมา


ผลลัพธ์จากโปรแกรม

มาดูโค้ดกันเถอะ
โค๊ด: [Select]
' / -----------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: www.facebook.com/g2gnet
' / Purpose: Load data from MS Excel into DataGridView with Unbound Control.
' / Microsoft Visual Basic .NET (2010) and MS Excel 2007
' / -----------------------------------------------------------------------------
Imports System.Data.OleDb

Public Class frmExcel2DataGrid

    Private Sub btnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles btnBrowse.Click
        ' ประกาศใช้งาน Open File Dialog ในแบบ Run Time
        Dim dlgOpenFile As OpenFileDialog = New OpenFileDialog()

        ' / ตั้งค่าการใช้งาน Open File Dialog
        With dlgOpenFile
            .InitialDirectory = MyPath(Application.StartupPath)
            .Title = "เลือกไฟล์ MS Excel"
            .Filter = "MS Excel Files (*.xlsx;*.xls)|*.xlsx;*xls"
            .FilterIndex = 1
            .RestoreDirectory = True
        End With
        ' หากเลือกปุ่ม OK หลังจากการ Browse ...
        dgvStudent.Rows.Clear()
        If dlgOpenFile.ShowDialog() = DialogResult.OK Then
            txtFileName.Text = dlgOpenFile.FileName
            Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
                dlgOpenFile.FileName & "; Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
            Dim Conn As New OleDbConnection(strConn)
            Conn.Open()
            ' มอง WorkSheet ให้เป็นตารางข้อมูล (Table)
            Dim dtSheets As DataTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
            Dim drSheet As DataRow

            cmbSheetName.Items.Clear()
            ' นำรายชื่อ WorkSheet ทั้งหมด มาเก็บไว้ที่ ComboBox เพื่อรอให้ User เลือกนำไปใช้งาน
            For Each drSheet In dtSheets.Rows
                cmbSheetName.Items.Add(drSheet("TABLE_NAME").ToString())
            Next
            Conn.Close()
        End If

    End Sub

    Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) _
        Handles cmbSheetName.SelectedIndexChanged
        Dim Conn As OleDbConnection
        Dim Comm As OleDbCommand

        Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
            txtFileName.Text & "; Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
        Try
            Conn = New OleDbConnection
            Conn.ConnectionString = strConn
            Comm = New OleDbCommand
            ' เสมือน WorkSheet เป็น Table ในฐานข้อมูล
            Comm.CommandText = "Select * FROM [" & cmbSheetName.Text & "]"
            Comm.Connection = Conn
            Conn.Open()
            ' ใช้ DataReader
            Dim DR As OleDbDataReader = Comm.ExecuteReader
            dgvStudent.Rows.Clear()
            Dim i As Long = 0
            ' / การใช้ UnBound Control จะทำงานได้ช้ากว่า Bound Control ก็จริง
            ' / แต่การประยุกต์ใช้งานจะทำได้ดีกว่า
            While DR.Read()
                If DR.HasRows Then
                    dgvStudent.Rows.Add()
                    dgvStudent.Rows(i).Cells(0).Value = DR.Item("ชื่อนักเรียน").ToString
                    dgvStudent.Rows(i).Cells(1).Value = DR.Item("คะแนน").ToString
                    ' ไปโปรแกรมย่อยเพื่อคำนวณหาเกรด โดยเอาค่าจากหลักที่ 2 (Index=1) ไปคำนวณ
                    dgvStudent.Rows(i).Cells(2).Value = CalGrade(dgvStudent.Rows(i).Cells(1).Value)
                End If
                i = i + 1
            End While
            DR.Close()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            Conn = Nothing
            Comm = Nothing
        End Try
    End Sub

    ' / ------------------------------------------------------------------
    ' / โปรแกรมย่อย (ฟังคชั่น) ในการคำนวณหาเกรด
    ' / ------------------------------------------------------------------
    Private Function CalGrade(Score As Integer) As String
        Dim Grade As String = ""
        Select Case Score
            Case 80 To 100
                Grade = "A"
            Case 70 To 79
                Grade = "B"
            Case 60 To 69
                Grade = "C"
            Case 51 To 59
                Grade = "D"
            Case 0 To 49
                Grade = "F"
            Case Else
                Grade = "Unknown"
        End Select
        CalGrade = Grade
    End Function

    ' / ------------------------------------------------------------------
    ' / ตั้งค่า DataGridView
    ' / ------------------------------------------------------------------
    Private Sub SetupDataGridView()

        dgvStudent.ColumnCount = 3
        With dgvStudent.ColumnHeadersDefaultCellStyle
            .BackColor = Color.Navy
            .ForeColor = Color.White
            .Font = New Font(dgvStudent.Font, FontStyle.Bold)
        End With

        With dgvStudent
            .Columns(0).Name = "ชื่อนักเรียน"
            .Columns(1).Name = "คะแนน"
            .Columns(2).Name = "เกรด"
        End With

    End Sub

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

    ' / ------------------------------------------------------------------
    ' / ฟังค์ชั่นที่เราสามารถกำหนด Path ให้กับโปรแกรมของเราเอง
    ' / Ex.
    ' / 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 btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

    Private Sub frmExcel2DataGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Call SetupDataGridView()
    End Sub
End Class

Conclusion:
ก็คงจะพอมองเห็นถึงความแตกต่างของการใช้งาน Bound และ Unbound Control ได้อย่างชัดเจนบ้างน่ะครับ ดังนั้นจึงต้องเลือกใช้งานให้เหมาะสมกับงานด้วยล่ะกันครับ

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

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

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
Re: [VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control
« ตอบกลับ #1 เมื่อ: เมษายน 20, 2016, 07:02:59 pm »
อาจารย์ครับ ดาวน์โหลด Error ครับ.

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

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
Re: [VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control
« ตอบกลับ #2 เมื่อ: เมษายน 20, 2016, 07:09:36 pm »
อาจารย์ครับ ดาวน์โหลด Error ครับ.

ดาวน์โหลดใหม่ได้เลยครับผม

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

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
Re: [VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control
« ตอบกลับ #3 เมื่อ: เมษายน 20, 2016, 07:18:15 pm »
ขอบคุณมากครับ  อยากถ่ายสำเนาคนเหมือนอาจารย์ไว้เยอะ(หายาก) ฮ่าๆๆ

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

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
Re: [VB.Net] นำข้อมูลจาก Excel เข้าสู่ DataGridView แบบ Unbound Control
« ตอบกลับ #4 เมื่อ: เมษายน 20, 2016, 07:21:43 pm »
ขอบคุณมากครับ  อยากถ่ายสำเนาคนเหมือนอาจารย์ไว้เยอะ(หายาก) ฮ่าๆๆ
:P :P :P :P :P

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