ผู้เขียน หัวข้อ: [VB6/VB.Net] นำรายชื่อจังหวัด อำเภอ ตำบลใส่ใน ComboBox เพื่อแสดงรหัสไปรษณีย์  (อ่าน 230 ครั้ง)

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

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
[VB6/VB.Net] นำรายชื่อจังหวัด อำเภอ ตำบลใส่ใน ComboBox เพื่อแสดงรหัสไปรษณีย์

ก่อนอื่นก็ต้องขอบคุณข้อมูลรหัสไปรษณีย์ทั่วไทย จาก คุณโกสินทร์ ไตรนิคม และทาง บริษัทไปรษณีย์ไทย จำกัด เป็นอย่างสูงมา ณ ที่นี้ด้วยน่ะครับ ...
ดาวน์โหลดฐานข้อมูล MS Access รหัสไปรษณีย์ไทยปี 2555 ได้ที่นี่
ดาวน์โหลดฐานข้อมูล MS Excel รหัสไปรษณีย์ไทยปี 2555 ได้ที่นี่


หน้าจอ VB6


หน้าจอ VB.Net 2010

แนวคิดการออกแบบ
สำหรับ Visual Basic มันมีจุดสำคัญอยู่ในเรื่องของ Event หรือ เหตุการณ์ ซึ่งตัวนี้ก็จะเป็นโปรแกรมย่อยนั่นเอง
1. โหลดรายชื่อจังหวัดเข้ามาใส่ใน ComboBox ก่อน
2. ผู้ใช้เลือกรายชื่อจังหวัด ต่อไปให้โหลดรายชื่ออำเภอเข้ามาใน ComboBox
3. เมื่อเลือกอำเภอ รายชื่อตำบลก็จะโผล่มาใส่ใน ComboBox
4. เมื่อเลือกตำบล ก็จะแสดงผลรหัสไปรษณีย์ และหมายเหตุ
5. เมื่อเปลี่ยนชื่อจังหวัด ข้อมูลอำเภอ และ ตำบล ก็จะถูก Clear ทิ้งออกไป
6. กลับไปข้อ 2

และไม่ว่าเราจะใช้ VB6 หรือ VB.Net (หรือภาษาอื่นๆ) มันก็ยังคงแนวคิดหลักเดิมๆเอาไว้ทั้งหมดครับ

มาดูโค้ดกันเถอะ ... Visual Basic 6
โค๊ด: [Select]
' / -----------------------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: www.facebook.com/g2gnet
' / Purpose:  Information PostCode data in Thailand.
' / Microsoft Visual Basic 6.0 Service Pack 6
' / -----------------------------------------------------------------------------------------------------------
Option Explicit

Dim ConnDB As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim Statement As String

Public Sub OpenDataBase()
On Error GoTo Err_Handler
Dim DB_File As String
    DB_File = App.Path
    If Right$(DB_File, 1) <> "\" Then DB_File = DB_File & "\"
    DB_File = DB_File & "PostCode2555.MDB"
    ' เชื่อมต่อไฟล์ข้อมูล - Open Connection
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        " Provider=Microsoft.Jet.OLEDB.4.0;" & _
        " Data Source=" & DB_File & ";" & _
        " Persist Security Info=False"
    ConnDB.Open
    Exit Sub

Err_Handler:
    MsgBox "Error : " & Err.Number & " " & Err.Description
    End
End Sub

Private Sub Form_Load()
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    ' เคลียร์หน้าจอ
    cmbProvince.Clear
    cmbAmphur.Clear
    cmbTumbon.Clear
    lblPostCode.Caption = ""
    txtRemark.Text = ""
   
    ' เชื่อมต่อฐานข้อมูล
    Call OpenDataBase
    ' โหลดรายชื่อจังหวัดเข้า ComboBox
    Call LoadProvince
End Sub

' / -----------------------------------------------------------------------------------------------------------
' Load รายการจังหวัดเข้ามาจากตาราง PostCode
' / -----------------------------------------------------------------------------------------------------------
Sub LoadProvince()
    Set RS = New ADODB.Recordset
    ' DISTINCT คือ หากชื่อรายการมันซ้ำ ต้องตัดให้เหลือเพียงรายการเดียว
    Statement = "SELECT DISTINCT PostCode.Province " & _
                        " From PostCode ORDER BY PostCode.Province "
    Set RS = ConnDB.Execute(Statement, , adCmdText)
    Do Until RS.EOF
        cmbProvince.AddItem "" & RS("Province")
        RS.MoveNext
    Loop
    RS.Close:    Set RS = Nothing
End Sub

' / -----------------------------------------------------------------------------------------------------------
' เลือกรายชื่อจังหวัด แล้วต้องเอาข้อมูลรายชื่ออำเภอมาแสดงผลใน ComboBox
' / -----------------------------------------------------------------------------------------------------------
Private Sub cmbProvince_Click()
    cmbAmphur.Clear
    cmbTumbon.Clear
    lblPostCode.Caption = ""
    txtRemark.Text = ""
   
    Set RS = New ADODB.Recordset
    Statement = "SELECT DISTINCT PostCode.Amphur, PostCode.Province " & _
                        " From PostCode  " & _
                        " WHERE " & _
                        " Province = " & "'" & cmbProvince.Text & "'" & _
                        " ORDER BY PostCode.Amphur "
    Set RS = ConnDB.Execute(Statement, , adCmdText)
    Do Until RS.EOF
        cmbAmphur.AddItem "" & RS("Amphur")
        RS.MoveNext
    Loop
    RS.Close:    Set RS = Nothing
End Sub

' / -----------------------------------------------------------------------------------------------------------
' เลือกอำเภอ แล้วจะต้องนำเอาข้อมูลรายชื่อตำบลเข้ามาไว้ใน ComboBox
' / -----------------------------------------------------------------------------------------------------------
Private Sub cmbAmphur_Click()
    cmbTumbon.Clear
    lblPostCode.Caption = ""
    txtRemark.Text = ""
   
    Set RS = New ADODB.Recordset
    ' เงื่อนไขทดสอบ ใช้ชื่อจังหวัด และ อำเภอด้วย
    ' DISTINCT คือ หากชื่อรายการมันซ้ำ ต้องตัดให้เหลือเพียงรายการเดียว
    Statement = "SELECT DISTINCT PostCode.Amphur, PostCode.Province, PostCode.Tumbon " & _
                        " From PostCode  " & _
                        " WHERE " & _
                        " Province = " & "'" & cmbProvince.Text & "'" & _
                        " AND " & _
                        " Amphur = " & "'" & cmbAmphur & "'" & _
                        " ORDER BY PostCode.Tumbon "
    Set RS = ConnDB.Execute(Statement, , adCmdText)
    Do Until RS.EOF
        cmbTumbon.AddItem "" & RS("Tumbon")
        RS.MoveNext
    Loop
    RS.Close:    Set RS = Nothing
End Sub

' / -----------------------------------------------------------------------------------------------------------
' เลือกตำบล แล้วจะแสดงรหัสไปรษณีย์
' / -----------------------------------------------------------------------------------------------------------
Private Sub cmbTumbon_Click()
    lblPostCode.Caption = ""
    txtRemark.Text = ""
   
    Statement = "SELECT PostCode.Province, PostCode.Amphur, PostCode.Tumbon, " & _
                        " PostCode.PostCode, PostCode.Remark " & _
                        " From PostCode  " & _
                        " WHERE " & _
                        " Province = " & "'" & cmbProvince.Text & "'" & _
                        " AND " & _
                        " Amphur = " & "'" & cmbAmphur & "'" & _
                        " AND " & _
                        " Tumbon = " & "'" & cmbTumbon & "'" & _
                        " ORDER BY PostCode.Tumbon "
    Set RS = ConnDB.Execute(Statement, , adCmdText)
    lblPostCode.Caption = "" & RS("PostCode")
    txtRemark.Text = "" & RS("Remark")
    RS.Close:   Set RS = Nothing
End Sub

Public Sub CloseDataBase()
    If ConnDB.State = adStateOpen Then
        ConnDB.Close
        Set ConnDB = Nothing
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call CloseDataBase
    Set frmMain = Nothing
    End
End Sub

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

มาดูโค้ดกันเถอะ ... Visual Basic .NET (2010)
โค๊ด: [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: Information PostCode data in Thailand.
' / Microsoft Visual Basic .NET (2010)
' / ----------------------------------------------------------------------------------------
Imports System.Data.OleDb
Imports System.Data.SqlClient

Public Class frmMain
    Dim ConnDB As OleDb.OleDbConnection
    Dim Statement As String

    Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.CenterToScreen()
        lblPostCode.Text = ""
        txtRemark.Text = ""
        Dim strPath As String = Application.StartupPath
        strPath = strPath.ToLower()
        strPath = strPath.Replace("\bin\debug", "\")
        Dim strConn As String = _
            "Provider = Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source = " & strPath & "Data\PostCode2555.mdb"
        Try
            ' เปิดการเชื่อมต่อไฟล์ฐานข้อมูล
            ConnDB = New OleDb.OleDbConnection(strConn)
            ConnDB.Open()
            Call LoadProvice()
        Catch ex As Exception
            MsgBox(ex.Message)
            Application.Exit()
        End Try
    End Sub

    ' / โหลดรายชื่อจังหวัดเข้าสู่ ComboBox
    Sub LoadProvice()
        lblPostCode.Text = ""
        txtRemark.Text = ""
        ' DISTINCT คือ หากชื่อรายการมันซ้ำ ต้องตัดให้เหลือเพียงรายการเดียว
        Statement = "SELECT DISTINCT PostCode.Province " & _
                " From PostCode ORDER BY PostCode.Province "
        Dim cmd As OleDbCommand = New OleDbCommand(Statement, ConnDB)
        Dim DR As OleDbDataReader = cmd.ExecuteReader
        While DR.Read()
            cmbProvince.Items.Add(DR.Item("Province").ToString)
        End While
        DR.Close()
    End Sub

    ' / เลือกรายชื่อจังหวัด และเอารายชื่ออำเภอเข้าสู่ ComboBox
    Private Sub cmbProvince_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles cmbProvince.SelectedValueChanged
        cmbAmphur.Items.Clear()
        cmbAmphur.Text = ""
        cmbTumbon.Items.Clear()
        cmbTumbon.Text = ""
        lblPostCode.Text = ""
        txtRemark.Text = ""
        Statement = "SELECT DISTINCT PostCode.Amphur, PostCode.Province " & _
                    " From PostCode  " & _
                    " WHERE " & _
                    " Province = " & "'" & cmbProvince.Text & "'" & _
                    " ORDER BY PostCode.Amphur "
        Dim cmd As OleDbCommand = New OleDbCommand(Statement, ConnDB)
        Dim DR As OleDbDataReader = cmd.ExecuteReader
        While DR.Read()
            cmbAmphur.Items.Add(DR.Item("Amphur").ToString)
        End While
        DR.Close()
    End Sub

    ' / เลือกรายชื่ออำเภอ และเอารายชื่อตำบลเข้าสู่ ComboBox
    Private Sub cmbAmphur_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles cmbAmphur.SelectedValueChanged
        cmbTumbon.Items.Clear()
        cmbTumbon.Text = ""
        lblPostCode.Text = ""
        txtRemark.Text = ""
        Statement = "SELECT DISTINCT PostCode.Amphur, PostCode.Province, PostCode.Tumbon " & _
                    " From PostCode  " & _
                    " WHERE " & _
                    " Province = " & "'" & cmbProvince.Text & "'" & _
                    " AND " & _
                    " Amphur = " & "'" & cmbAmphur.Text & "'" & _
                    " ORDER BY PostCode.Tumbon "
        Dim cmd As OleDbCommand = New OleDbCommand(Statement, ConnDB)
        Dim DR As OleDbDataReader = cmd.ExecuteReader
        While DR.Read()
            cmbTumbon.Items.Add(DR.Item("Tumbon").ToString)
        End While
        DR.Close()
    End Sub

    ' / เลือกรายชื่อตำบล และเอารหัสไปรษณีย์มาแสดงผลใน Label Control
    Private Sub cmbTumbon_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles cmbTumbon.SelectedValueChanged
        lblPostCode.Text = ""
        txtRemark.Text = ""
        Statement = "SELECT PostCode.Province, PostCode.Amphur, PostCode.Tumbon, " & _
                    " PostCode.PostCode, PostCode.Remark " & _
                    " From PostCode  " & _
                    " WHERE " & _
                    " Province = " & "'" & cmbProvince.Text & "'" & _
                    " AND " & _
                    " Amphur = " & "'" & cmbAmphur.Text & "'" & _
                    " AND " & _
                    " Tumbon = " & "'" & cmbTumbon.Text & "'" & _
                    " ORDER BY PostCode.Tumbon "
        Dim cmd As OleDbCommand = New OleDbCommand(Statement, ConnDB)
        Dim DR As OleDbDataReader = cmd.ExecuteReader
        While DR.Read()
            ' การนำเอา Double Quote มาวางขวางก่อน ก็เพราะเผื่อข้อมูลมันเป็น Null ก็จะเกิด Error
            ' ใช้หลักการเดียวกันกับ VB6 เลยครับท่านผู้ชม
            lblPostCode.Text = "" & DR.Item("PostCode")
            txtRemark.Text = "" & DR.Item("Remark")
        End While
        DR.Close()
    End Sub

    Private Sub frmMain_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ConnDB.Close()
        Me.Dispose()
        Application.Exit()
    End Sub
End Class

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

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

ออฟไลน์ naien

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

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

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
ขอบพระคุณมากครับ ขอให้สุขภาพแข็งแรงๆๆ

Thank you ครับผม.

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