phatthawat โพสต์ 2019-5-25 01:02:00

Visual Basic เอา ComboBox ลง Access ยังไงครับ



รบกวนขอสอบถามการเขียนโค้ดนะครับ

1.ถ้าผมป้อนหมายเลขไปที่ช่องหมาเลข 1 จากนั้นก็เลือกข้อมูลตามหมายเลข 2 3 4 จากนั้นกดบันทึก
อยากจะไม่ให้หมายเลข 2 3 4 หายไปได้อย่างไรครับ ให้แต่หมายเลข 1 นั้นหายไป รอการป้อนข้อมูลต่อไป

2.ตรง DataGrid เมื่อกดเพิ่มข้อมูลแล้วมันติดลบครับ ตรงสีฟ้าๆ

3.ถ้าหากผมอยากป้อนข้อมูลลงหมายเลข 1 ไปเรื่อยๆ แล้วกดบันทึกทีเดียว และข้อมูลบนหมายเลข 2 3 4 ตามมาด้วย
   เขียนโค้ดประมาณไหนครับ

###ขอขอบคุณล่วงหน้านะครับ หากเป็นการรบกวนจนเกินไป แนะนำแนวทางให้ผมก็ได้ครับ ขอบคุณครับ :P

thongkorn โพสต์ 2019-5-25 12:49:05

ควรจะอธิบายรายละเอียดให้มากกว่านี้ จะให้โปรแกรมทำอะไร ออกแบบตารางข้อมูลยังไงครับ

phatthawat โพสต์ 2019-5-26 23:50:11

thongkorn ตอบกลับเมื่อ 2019-5-25 12:49
ควรจะอธิบายรายละเอียดให้มากกว่านี้ จะให้โปรแกรมทำอะไร ออกแบบตารางข้อมูลยังไงครับ

รูปภาพ https://uppic.cc/d/KERF

ผมออกแบบตารางโดยการนำฐานข้อมูลมาจากโปรแกรม Access โดยนำข้อมูลที่มีอยู่แล้วประมาณ 100 รายการ ทำการ Add New Data Source จากไฟล์ Access จากนั้นก็ทำฟอร์มรับข้อมูล โดยผมสร้างปุ่ม รับ ลบ ค้นหา แก้ไขข้อมูล ตามตัวอย่างใน Youtube ทีนี้ผมติดปัญหาตรงที่ว่า กด New เพื่อเพิ่มข้อมูลลงไปในตาราง ลำดับมันติดลบ -1 เมื่อผมกดปุ่ม Delete ออก โปรแกรมแจ้ง error https://uppic.cc/d/KES4 ตามภาพเลยครับ

/***********************************************************
ส่วนโปรแกรมที่ออกแบบไว้คืออยากทำฟอร์ม บันทึก แก้ไข ลบ การเบิกของประจำวันครับ สามารถเพิ่มข้อมูลทีละมากๆ ได้ โดยกดที่ LNB โปรแกรมจะเปิดหน้าฟอร์มขึ้นมาใหม่ จากนั้นผมก็จะเลือกข้อมูลก่อนเช่น วันที่ หมายเลขทะเบียน สถานะ
>> หลังจากนั้นกด New ผมก็จะยิงบาร์โค้ดไปเรื่อยๆ หลังจากที่ครบแล้วผมก็จะกดบันทึก
>> ข้อมูลที่บันทึกจะไปอยู่ที่ตารางหลักครับ ประมาณนี้ครับ

หากอธิบายไม่เข้าใจผมขออภัยจริงๆครับ ผมพึ่งจับ Visual ได้ 2 วันครับ ต้องขอโทษด้วยนะครับ

thongkorn โพสต์ 2019-5-27 20:23:32

ผมว่าต้องออกแบบตารางข้อมูลใหม่ก่อนดีกว่าครับ เพราะจากรูปมันเป็นมุมมองมาจากการใช้ Excel ซึ่งต่างไปจากการเก็บข้อมูลลง DataBase ผมขอยกตัวอย่างโปรแกรมในลักษณะเดียวกันให้ดู เป็นโปรแกรมเบิกจ่ายวัสดุ โดยที่ใบเบิก 1 ใบ จะมีพนักงาน/เจ้าหน้าทีทำเรื่องเบิกเพียง 1 คน แต่สามารถเบิกวัสดุพร้อมกันได้หลายชนิด ซึ่งการออกแบบนี้จะลดความซ้ำซ้อนของการจัดเก็บข้อมูลครับผม...

thongkorn โพสต์ 2019-5-28 11:10:33

การเขียนโปรแกรมด้วย Visual Basic ไม่ได้ง่ายๆเหมือนที่หลายๆคนคิด อันดับแรกต้องเรียนรู้การใช้งาน Control ต่างๆและสามารถควบคุมมันให้ได้ก่อนครับ ผมก็เลยเขียนโค้ดบางส่วนให้ได้นำไปศึกษาดูครับ ซึ่งเราจะเรียกว่า Run Time หรือโปรแกรมจะทำงานตามคำสั่งในขณะที่รันโปรแกรม ซึ่งจะมีประสิทธิภาพและมีความยืดหยุ่นสูงมาก จะทำให้เราสามารถควบคุมการทำงานของโปรแกรมได้ดีกว่า ...Public Class frmBorrowMaterial

    Private Sub frmBorrowMaterial_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      '// Initialized DataGridView
      Call InitGridView()
      '// จำลองข้อมูลจาก DataTable มาแสดงผลใน ComboBox
      Call PopulateComboBox(cmbPlate, "PlatePK", "PlateName", GetTablePlate)
      Call PopulateComboBox(cmbStatus, "StatusPK", "StatusName", GetTableStatus)
    End Sub

    ' / --------------------------------------------------------------------------------
    ' / Load table detail into ComboBox
    Public Sub PopulateComboBox(ByRef cmbCtrl As ComboBox, strFieldPK As String, strFieldName As String, ByRef DT As DataTable)
      Try
            '/ Primary Key (ValueMember)
            cmbCtrl.ValueMember = strFieldPK
            '/ Display the name
            cmbCtrl.DisplayMember = strFieldName
            cmbCtrl.DataSource = DT
            '// Autocomplete
            With cmbCtrl
                '.DropDownStyle = ComboBoxStyle.DropDownList
                '.AutoCompleteMode = AutoCompleteMode.None
                '// สามารถคีย์ค่าลงได้
                .DropDownStyle = ComboBoxStyle.DropDown
                .AutoCompleteMode = AutoCompleteMode.SuggestAppend
                .AutoCompleteSource = AutoCompleteSource.ListItems
            End With
      Catch ex As Exception
            MessageBox.Show(ex.Message)
      End Try
    End Sub

    Private Sub InitGridView()
      With dgvData
            ' Columns Specified
            .Columns.Add("BorrowPK", "BorrowPK")
            .Columns.Add("MemberID", "หมายเลขสมาชิก")
            .Columns.Add("LnbID", "หมายเลข LNB")
            .Columns.Add("DateBorrow", "วันที่เบิก")
            .Columns.Add("Status", "สถานะ")
            .Columns.Add("Plate", "ทะเบียน")
      End With
      '//
      With dgvData
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .ReadOnly = True
            '//
            .Font = New Font("Tahoma", 9)
            .RowTemplate.Height = 26
            .RowTemplate.MinimumHeight = 26
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            '// Even-Odd Color
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
                .WrapMode = DataGridViewTriState.False
            End With
      End With
    End Sub

    '// ทำข้อมูลตัวอย่างเก็บไว้ใน DataTable
    Function GetTablePlate() As DataTable
      Dim DT = New DataTable
      '/ Add columns.
      DT.Columns.Add("PlatePK", GetType(Integer))
      DT.Columns.Add("PlateName", GetType(String))
      '//
      DT.Rows.Add(1, "กข ขอนแก่น 1234")
      DT.Rows.Add(2, "ออ หนองคาย 5555")
      DT.Rows.Add(3, "ขข อุดรธานี 7890")
      DT.Rows.Add(4, "บบ นครราชสีมา 1111")
      DT.Rows.Add(5, "ดด เชียงใหม่ 5050")
      '//
      Return DT
    End Function

    Function GetTableStatus() As DataTable
      Dim DT = New DataTable
      '/ Add columns.
      DT.Columns.Add("StatusPK", GetType(Integer))
      DT.Columns.Add("StatusName", GetType(String))
      '//
      DT.Rows.Add(1, "พร้อมใช้งาน")
      DT.Rows.Add(2, "ซ่อมบำรุง")
      DT.Rows.Add(3, "จำหน่าย")
      '//
      Return DT
    End Function

    Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click
      '// เช็คค่าว่าง
      If txtMemberID.Text = "" Or txtLNB.Text = "" Then Exit Sub
      '// เพิ่มแถวใหม่ และคำนวณหาค่าสูงสุดในหลักแรก (Index = 0)
      Dim MaxRow As Integer = 0
      For i As Integer = 0 To dgvData.Rows.Count() - 1 Step 1
            If i = 0 Then
                MaxRow = dgvData.Rows(i).Cells(0).Value
                Exit For
            End If
            If MaxRow < dgvData.Rows(i).Cells(0).Value Then
                MaxRow = dgvData.Rows(i).Cells(0).Value
            End If
      Next
      MaxRow += 1
      '//
      Dim row As String() = New String() {MaxRow, txtMemberID.Text, txtLNB.Text, Format(dtpBorrow.Value, "dd/MM/yyyy"), cmbStatus.Text, cmbPlate.Text}
      dgvData.Rows.Add(row)
      '// Clear value
      txtMemberID.Clear()
      txtLNB.Clear()
      txtMemberID.Focus()
    End Sub

    Private Sub btnRemove_Click(sender As System.Object, e As System.EventArgs) Handles btnRemove.Click
      '// ลบรายการแถวที่เลือกออกไป
      If dgvData.RowCount = 0 Then Exit Sub
      dgvData.Rows.Remove(dgvData.CurrentRow)
      txtMemberID.Focus()
    End Sub
End Class


thongkorn โพสต์ 2019-5-28 12:26:36

สำหรับคำถามที่ถามว่าจะอ่านค่า Primary Key ของทะเบียนรถ (หรือสถานะ) ใน ComboBox ได้อย่างไร ... มีหลายวิธีครับ หากเอาวิธีที่ง่ายสุดๆ ก็คือการเอาค่า Primary Key ของแต่ละตัวไปซ่อนเอาไว้ในตารางกริด

เริ่มต้นสร้างหลักมาเพิ่ม และซ่อนมันเอาไว้ด้วยการกำหนด Visible = False
    Private Sub InitGridView()
      With dgvData
            ' Columns Specified
            .Columns.Add("BorrowPK", "BorrowPK")
            .Columns.Add("MemberID", "หมายเลขสมาชิก")
            .Columns.Add("LnbID", "หมายเลข LNB")
            .Columns.Add("DateBorrow", "วันที่เบิก")
            .Columns.Add("Status", "สถานะ")
            .Columns.Add("Plate", "ทะเบียน")
            .Columns.Add("PlatePK", "PlatePK")'// ซ่อนค่านี้ไว้
      End With
      dgvData.Columns("PlatePK").Visible = False
      '//
      With dgvData
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .ReadOnly = True
            '//
            .Font = New Font("Tahoma", 9)
            .RowTemplate.Height = 26
            .RowTemplate.MinimumHeight = 26
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            '// Even-Odd Color
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
                .WrapMode = DataGridViewTriState.False
            End With
      End With
    End Sub
เวลาที่นำข้อมูลไปเพิ่มในตารางกริด ก็ใส่ค่า ValueMember ลงไปต่อท้าย (SelectedValue) แล้วนำค่าในหลักนี้ไปเก็บลงฐานข้อมูล ...
    Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click
      '// เช็คค่าว่าง
      If txtMemberID.Text = "" Or txtLNB.Text = "" Then Exit Sub
      '// เพิ่มแถวใหม่ และคำนวณหาค่าสูงสุดในหลักแรก (Index = 0)
      Dim MaxRow As Integer = 0
      For i As Integer = 0 To dgvData.Rows.Count() - 1 Step 1
            If i = 0 Then
                MaxRow = dgvData.Rows(i).Cells(0).Value
                Exit For
            End If
            If MaxRow < dgvData.Rows(i).Cells(0).Value Then
                MaxRow = dgvData.Rows(i).Cells(0).Value
            End If
      Next
      MaxRow += 1
      '//
      Dim row As String() = New String() {MaxRow, txtMemberID.Text, txtLNB.Text, Format(dtpBorrow.Value, "dd/MM/yyyy"), cmbStatus.Text, cmbPlate.Text, cmbPlate.SelectedValue}
      dgvData.Rows.Add(row)
      '// Clear value
      txtMemberID.Clear()
      txtLNB.Clear()
      txtMemberID.Focus()
    End Sub



anuyut1995 โพสต์ 2019-5-29 16:19:16

แจ่ม{:2_33:}
หน้า: [1]
ดูในรูปแบบกติ: Visual Basic เอา ComboBox ลง Access ยังไงครับ