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
ควรจะอธิบายรายละเอียดให้มากกว่านี้ จะให้โปรแกรมทำอะไร ออกแบบตารางข้อมูลยังไงครับ
รูปภาพ 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 วันครับ ต้องขอโทษด้วยนะครับ ผมว่าต้องออกแบบตารางข้อมูลใหม่ก่อนดีกว่าครับ เพราะจากรูปมันเป็นมุมมองมาจากการใช้ Excel ซึ่งต่างไปจากการเก็บข้อมูลลง DataBase ผมขอยกตัวอย่างโปรแกรมในลักษณะเดียวกันให้ดู เป็นโปรแกรมเบิกจ่ายวัสดุ โดยที่ใบเบิก 1 ใบ จะมีพนักงาน/เจ้าหน้าทีทำเรื่องเบิกเพียง 1 คน แต่สามารถเบิกวัสดุพร้อมกันได้หลายชนิด ซึ่งการออกแบบนี้จะลดความซ้ำซ้อนของการจัดเก็บข้อมูลครับผม...
การเขียนโปรแกรมด้วย 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
สำหรับคำถามที่ถามว่าจะอ่านค่า 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
แจ่ม{:2_33:}
หน้า:
[1]