ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 9963|ตอบกลับ: 10

[VB.NET] แจกโค้ดฟรีระบบการขายสินค้าแบบเงินสด ด้วยการตัดสต็อกอัตโนมัติ

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583



การเขียนโปรแกรมเพื่อจัดการกับระบบฐานข้อมูล จะใช้ความสัมพันธ์อยู่ 2 แบบหลักๆ คือ One To One เช่น ลูกค้า 1 รายสามารถซื้อสินค้าได้ทีละ 1 ครั้ง และแบบ One To Many เช่น รายการซื้อสินค้าของลูกค้า 1 รายการ สามารถซื้อสินค้าได้หลายชนิด หรือ รายการ ... ซึ่งวันนี้แอดมินจะนำเสนอโค้ดในแบบ One To Many เป็นการขายสินค้าแบบเงินสด คือการที่ลูกค้านำสินค้ามาให้พนักงานยิงบาร์โค้ด เพื่อทำรายการขายสินค้า โดยสามารถตัดสต็อกได้ ทั้งยังสามารถลด / เพิ่มจำนวนสินค้าได้ และยังคืนสินค้าบางรายการทั้งหมดได้ ...

หลักการคิดจะใช้แบบ Flow Control ตามวิธีขายสินค้าทั่วๆไป คือ (1) ทำรายการขายใหม่ (2) แก้ไขจำนวนรายการขายสินค้าเดิม (3) ลบบางรายการสินค้าทิ้งไป ... เทคนิคในการตัดสต็อกของแอดมิน คือ สร้างหลัก (Column) ท้ายสุดเอาไว้ที่ตารางกริด เพื่อให้เก็บจำนวนที่ขายออกไปในแต่ละครั้ง แต่ให้ซ่อนหลักนี้ หรือ Visible = False เอาไว้ ... เราจะใช้สูตรเดียวกันทั้งหมด คือ ...

จำนวนสต็อก = จำนวนสต็อก + จำนวนขายเดิม - จำนวนขายใหม่

(1) ทำรายการขายใหม่ สินค้าเดิมจะมีค่าเท่ากับ 0 อันนี้คงไม่ต้องอธิบายมากมาย


(2) แก้ไขจำนวนรายการขายสินค้าเดิม ... อันนี้ตามภาพประกอบเลยครับ


(3) การลบบางรายการทิ้งไป ... อันนี้จะยุ่งยากขึ้นมาหน่อย เหตุการณ์นี้จะเกิดเฉพาะตอนแก้ไขรายการเดิมเท่านั้น ดังนั้นเราจะต้องทำการตรวจสอบรายการเดิมที่ขายสินค้าออกไปในตารางข้อมูล InvoiceDetail ซึ่งจะเก็บรายการขายสินค้าและจำนวนเอาไว้ แล้วนำไปเปรียบเทียบกับข้อมูลแถวในตารางกริด หากพบในตารางข้อมูล (InvoiceDetail) แต่ไม่มีในตารางกริด แสดงว่ารายการขายสินค้าตัวนี้ถูกลบออกไปแล้ว จะต้องนำค่าจำนวนที่ขายสินค้าที่อยู่ในตาราง InvoiceDetail เอากลับไปคืนให้กับจำนวนสต็อกในตารางสินค้า หรือ Product ก่อน ...


โค้ดต่างๆในการตัดสต็อกจะอยู่ที่โปรแกรมย่อย SaveData ที่เดียว ไม่ว่าจะเป็นการเพิ่ม หรือแก้ไข ...
  1.     ' / --------------------------------------------------------------------
  2.     ' / SAVE DATA
  3.     Sub SaveData()
  4.         Try
  5.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  6.             '// NewData = True, It's Add New Mode
  7.             If NewData Then
  8.                 '// (SetupNewPK อยู่ใน modDataBase.vb)
  9.                 '// การหาค่า Primary Key ของ InvoicePK จะอยู่ในกระบวนการสุดท้าย เพื่อป้องกัน Primary Key ซ้ำกัน
  10.                 PK = SetupNewPK("SELECT MAX(Invoice.InvoicePK) AS MaxPK FROM Invoice")
  11.                 strSQL = _
  12.                     " INSERT INTO Invoice(" & _
  13.                     " InvoicePK, CustomerFK, TotalAmount, DateInvoice) " & _
  14.                     " VALUES(" & _
  15.                     "'" & PK & "', " & _
  16.                     "'1', " & _
  17.                     "'" & CDbl(txtTotalAmount.Text) & "', " & _
  18.                     "'" & Now.ToString("dd/MM/yyyy") & "'" & _
  19.                     ")"
  20.                 '// การแก้ไข
  21.             Else
  22.                 '// START UPDATE
  23.                 strSQL = _
  24.                     " UPDATE Invoice SET " & _
  25.                     " [InvoicePK]='" & PK & "', " & _
  26.                     " [CustomerFK]='1', " & _
  27.                     " [TotalAmount]='" & CDbl(txtTotalAmount.Text) & "'" & _
  28.                     " WHERE InvoicePK = " & PK & ""
  29.             End If
  30.             '// บันทึกข้อมูลลงในตาราง Invoice (ฟังค์ชั่น DoSQL อยู่ใน modDataBase.vb)
  31.             Call DoSQL(strSQL)
  32.             '/ -----------------------------------------------------------------
  33.             '// I M P O R T A N T
  34.             '// ก่อนลบข้อมูลขายสินค้า จากตารางข้อมูล InvoiceDetail ณ ปัจจุบัน ต้องคืนจำนวนสินค้ากลับไปให้ตารางสินค้าก่อน เพราะบางแถวรายการของตารางกริดอาจจะถูกลบออกไป
  35.             '// เช่น เดิมมีการขายสินค้าออกไป 2 รายการ แต่แถวที่ 2 ถูกลบออกไป ซึ่งมักจะเกิดจากการคืนสินค้า ดังนั้นรายการแถวในตารางกริด จะไม่ตรงกับการขายของเดิม
  36.             '// ต้องคืนจำนวนสินค้าจากรายการที่ 2 กลับเข้าไปในสต็อกก่อนจะลบ InvoiceDetail ปัจจุบันทิ้ง แล้วค่อย INSERT กลับไปใหม่อีกครั้ง ด้วย InvoicePK ตัวเดิม
  37.             '// ***** กรณีของการแก้ไขข้อมูลเท่านั้น *****
  38.             If Not NewData Then
  39.                 Dim SqlStmt As String = " SELECT * FROM InvoiceDetail WHERE InvoicePK = " & PK
  40.                 Cmd = New OleDb.OleDbCommand
  41.                 Cmd.Connection = Conn
  42.                 Cmd.CommandText = SqlStmt
  43.                 Dim DR As OleDbDataReader = Cmd.ExecuteReader
  44.                 '// Set Flag
  45.                 Dim blnDataExist As Boolean = False
  46.                 While DR.Read
  47.                     Dim PFK As Long = CLng(DR.Item("ProductFK").ToString)
  48.                     For iRow = 0 To dgvData.RowCount - 1
  49.                         '// ค่า Primary Key ใน DB มีค่าเท่ากับใน DataGrid หรือไม่
  50.                         If CLng(DR.Item("ProductFK").ToString) = dgvData.Rows(iRow).Cells(0).Value Then
  51.                             '// เพื่อให้วนรอบไปที่ While ต่อทันที
  52.                             blnDataExist = True
  53.                             '// ไม่ต้องเช็คต่ออีกแล้ว ... กลับไปวนรอบ While เพื่อเช็คแถวรายการในตารางข้อมูล InVoiceDetail ใหม่อีกรอบ
  54.                             Exit For
  55.                         Else
  56.                             blnDataExist = False
  57.                         End If
  58.                     Next
  59.                     '// ไม่มีข้อมูลในตารางกริด แต่พบในตารางข้อมูล แสดงว่าถูกลบแถวรายการออกไป
  60.                     '// เอาค่าจำนวนสินค้าในตาราง InvoiceDetail ณ ปัจจุบัน กลับไปบวกเข้าในสต็อก (ตารางสินค้า - Product) ก่อน
  61.                     '// Not True = False (ไม่จริง = เท็จ) เพราะต้องการเงื่อนไขเท็จ
  62.                     If Not blnDataExist Then
  63.                         '// เอากลับมาบวกคืนในสต็อคตารางสินค้า
  64.                         '// ProductFK คือการอ่านค่ามาจาก InvoiceDetail
  65.                         strSQL = _
  66.                             " UPDATE Product SET " & _
  67.                             " [Stocked]=Stocked + '" & CDbl(DR.Item("Quantity").ToString) & "'" & _
  68.                             " WHERE ProductPK = " & CLng(DR.Item("ProductFK").ToString) & ""
  69.                         '// UPDATE
  70.                         Call DoSQL(strSQL)
  71.                         '//
  72.                         DS.Dispose()
  73.                         DA.Dispose()
  74.                     End If
  75.                 End While
  76.                 DR.Close()
  77.             End If
  78.             '/ -----------------------------------------------------------------
  79.             '/ -----------------------------------------------------------------
  80.             '// ลบข้อมูลในตารางย่อย (InvoiceDetail) ณ ปัจจุบันออกให้หมดก่อน แล้วค่อยทำการเพิ่มเข้าไปใหม่
  81.             '// การเพิ่มข้อมูลใหม่ จะไม่มีผลอะไร
  82.             strSQL = " DELETE FROM InvoiceDetail WHERE InvoicePK = " & PK
  83.             Call DoSQL(strSQL)
  84.             '/ -----------------------------------------------------------------
  85.             '/ เพราะเราลบข้อมูลการขายทุกรายการออกจากตาราง InvoiceDetail ดังนั้นจึงต้องทำการ INSERT เข้าไปใหม่
  86.             '// INSERT ข้อมูลปัจจุบันจากตารางกริด เข้าไปใหม่ในตาราง InvoiceDetail ด้วยการ Loop ข้อมูลจากตารางกริด
  87.             For iRow = 0 To dgvData.RowCount - 1
  88.                 strSQL = _
  89.                     " INSERT INTO InvoiceDetail(" & _
  90.                     " InvoicePK, ProductFK, Quantity, UnitPrice ,TotalAmount) " & _
  91.                     " VALUES(" & _
  92.                     "'" & PK & "'," & _
  93.                     "'" & dgvData.Rows(iRow).Cells(0).Value & "'," & _
  94.                     "'" & dgvData.Rows(iRow).Cells(3).Value & "'," & _
  95.                     "'" & dgvData.Rows(iRow).Cells(4).Value & "'," & _
  96.                     "'" & dgvData.Rows(iRow).Cells(5).Value & "'" & _
  97.                     ")"
  98.                 '// UPDATE
  99.                 Call DoSQL(strSQL)
  100.             Next
  101.             '// -----------------------------------------------------------------
  102.             '// ปรับสต็อคใหม่
  103.             '// จำนวนคงเหลือ = จำนวนคงเหลือ + จำนวนการขายเดิม (หลักที่ 6 - Qty) - จำนวนสินค้าที่ขายใหม่ (หลักที่ 3 - Quantity)
  104.             '// ตอนนี้จะทำงานเฉพาะตารางข้อมูลสินค้าเท่านั้น (tblProduct)
  105.             For iRow = 0 To dgvData.RowCount - 1
  106.                 strSQL = _
  107.                     " UPDATE Product SET " & _
  108.                     " Stocked = Stocked + '" & CLng(dgvData.Rows(iRow).Cells(6).Value) - CLng(dgvData.Rows(iRow).Cells(3).Value) & "'" & _
  109.                     " WHERE ProductPK = " & CLng(dgvData.Rows(iRow).Cells(0).Value) & ""
  110.                 '// UPDATE
  111.                 Call DoSQL(strSQL)
  112.             Next
  113.             MessageBox.Show("ปรับปรุงข้อมูลเรียบร้อย.", "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Information)

  114.         Catch ex As Exception
  115.             MessageBox.Show(ex.Message)
  116.         End Try
  117.     End Sub
คัดลอกไปที่คลิปบอร์ด

In Line Edit ... แอดมินขอนำเสนอเรื่องของ In Line Edit คือการที่ผู้ใช้งานสามารถแก้ไขข้อมูลจำนวนสินค้า (เลขจำนวนเต็ม) และราคาสินค้า (เลขทศนิยม) ได้ในรายการขายสินค้านั้นๆในเซลล์ของตารางกริดได้ทันที เพื่ออำนวยความสะดวกให้กับผู้ใช้งาน ... เหตุการณ์ทั้งหมดจะอยู่ที่ Events ของ DataGridView




โค้ดในการควบคุมเซลล์ของตารางกริด ... ต้องใช้การทำ Debugger (F8) ถึงจะสามารถเข้าใจขั้นตอนการทำงานได้ดีครับผม
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Before Edit Data
  3.     Private Sub dgvData_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvData.CellBeginEdit
  4.         Dim Quantity As Integer = dgvData.Rows(e.RowIndex).Cells(3).Value
  5.         Dim UnitPrice As Double = dgvData.Rows(e.RowIndex).Cells(4).Value
  6.         dgvData.Rows(e.RowIndex).Cells(5).Value = (Quantity * UnitPrice).ToString("#,##0.00")
  7.         ' / Summary
  8.         Call CalSumTotal()
  9.     End Sub

  10.     ' / --------------------------------------------------------------------------------
  11.     ' / After you press Enter
  12.     Private Sub dgvData_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit

  13.         Select Case e.ColumnIndex
  14.             Case 3, 4 ' Column Index = 3 (Quantity), Column Index = 4 (UnitPrice)
  15.                 ' Quantity, If Null Value
  16.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(3).Value) Then dgvData.Rows(e.RowIndex).Cells(3).Value = 0
  17.                 Dim Quantity As Integer = dgvData.Rows(e.RowIndex).Cells(3).Value
  18.                 '/------------------------------------------------------------
  19.                 ' Keep original value in temporary. (Tag Properties)
  20.                 dgvData.Tag = Quantity
  21.                 '/------------------------------------------------------------
  22.                 If Quantity <= 0 Then
  23.                     dgvData.Rows(e.RowIndex).Cells(3).Value = 1
  24.                     Quantity = 1
  25.                 End If

  26.                 ' / ----------------------------------------------------------------------------
  27.                 ' / UNIT PRICE = Index = 4
  28.                 ' UnitPrice, If Null Value
  29.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(4).Value) Then dgvData.Rows(e.RowIndex).Cells(4).Value = 0.0
  30.                 Dim UnitPrice As Double = dgvData.Rows(e.RowIndex).Cells(4).Value
  31.                 ' / ----------------------------------------------------------------------------
  32.                 ' Quantity x UnitPrice
  33.                 dgvData.Rows(e.RowIndex).Cells(5).Value = (Quantity * UnitPrice).ToString("#,##0.00")
  34.                 ' / SUM
  35.                 CalSumTotal()

  36.         End Select
  37.     End Sub

  38.     ' / --------------------------------------------------------------------------------
  39.     Private Sub dgvData_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
  40.         Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Name
  41.             ' / Can use both ColumeIndex or Field Name
  42.             Case "Quantity", "UnitPrice"
  43.                 RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
  44.                 AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
  45.         End Select
  46.     End Sub

  47.     ' / --------------------------------------------------------------------------------
  48.     ' / ดักการกดคีย์ลงในหลัก 3 (Quantity) ซึ่งเป็นเลขจำนวนเต็ม
  49.     Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
  50.         Dim tb As TextBox = sender
  51.         Select Case dgvData.CurrentCell.ColumnIndex
  52.             Case 3  ' Quantity is Integer
  53.                 Select Case e.KeyChar
  54.                     Case "0" To "9"   ' digits 0 - 9 allowed
  55.                     Case ChrW(Keys.Back)    ' backspace allowed for deleting (Delete key automatically overrides)
  56.                     Case Else ' everything else ....
  57.                         'True = CPU cancel the KeyPress event
  58.                         e.Handled = True ' and it's just like you never pressed a key at all
  59.                 End Select

  60.                 ' / UnitPrice is Double
  61.             Case 4
  62.                 Select Case e.KeyChar
  63.                     Case "0" To "9"
  64.                         ' Allowed "."
  65.                     Case "."
  66.                         ' can present "." only one
  67.                         If InStr(tb.Text, ".") Then e.Handled = True

  68.                     Case ChrW(Keys.Back)
  69.                         'Case ChrW(Keys.Delete)
  70.                     Case Else
  71.                         e.Handled = True
  72.                 End Select
  73.         End Select
  74.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการค้นหาสินค้า และให้คืนค่า ProductPK กลับคืนมาให้ฟอร์มหลัก ... แอดมินเขียนคอมเมนท์เอาไว้ให้ถึงวิธีการคืนค่ากลับ สามารถทำได้หลายวิธี ก็ลองไปคิดเพิ่มเติมดูกันน่ะครับ


  1. Imports System.Data.OleDb

  2. Public Class frmSearchProduct

  3.     '// โค้ดชุดนี้แสดงตัวอย่างของการแสดงผลรายการสินค้าทั้งหมด ด้วยการใช้ DataSet (ListtAllDataSet)
  4.     '// ส่วนการค้นหาจะใช้ DataReader (SearchDataReader)
  5.     '// การใช้งานจริงจะใช้อย่างใดอย่างหนึ่งเท่านั้นก็ได้ครับผม

  6.     '/ เกิดเหตุการณ์ดับเบิ้ลคลิ๊กในแต่ละแถวของตารางกริด จะคืนค่า ProductPK กลับไปให้กับฟอร์ม (frmInvoiceDetail.vb) ที่เรียกมันมา
  7.     Private Sub dgvData_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellDoubleClick
  8.         ' / ส่งค่า ProductPK ที่ถูกซ่อนในหลักแรก (Index = 0) กลับคืนไป
  9.         ' / ---- มีหลายวิธีในการคืนค่ากลับไป โดยที่ไม่ต้องกลับไปค้นหารายการสินค้าใหม่ เช่น ส่งกลับแบบ Array หรือ List ----
  10.         ' / ไปลองคิดค้นหาวิธีการเพิ่มเติมด้วยล่ะกันครับ
  11.         SearchPK = dgvData.Item(0, dgvData.CurrentRow.Index).Value
  12.         Me.Close()
  13.     End Sub

  14.     Private Sub frmSearchProduct_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  15.         Me.Dispose()
  16.         GC.SuppressFinalize(Me)
  17.     End Sub

  18.     Private Sub frmSearchProduct_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  19.         Me.CenterToScreen()
  20.         Me.Text = "ค้นหารายการสินค้า"
  21.         txtSearch.Text = ""
  22.         '// แสดงรายการทั้งหมดด้วยการใช้ DataSet
  23.         Call ListAllDataSet()
  24.         lblRecordCount.Text = "[จำนวน : " & dgvData.RowCount & " รายการ.]"
  25.     End Sub

  26.     Private Sub txtSearch_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtSearch.KeyPress
  27.         ' ดักจับตัวอักขระอันไม่พึงปรารถนาสำหรับฐานข้อมูล เช่น ', * หรือ %
  28.         txtSearch.Text = txtSearch.Text.Trim.Replace("'", "").Replace("%", "").Replace("*", "")
  29.         If Trim(txtSearch.Text) = "" Or Len(Trim(txtSearch.Text)) = 0 Then Exit Sub
  30.         '/ ค้นหาข้อมูลด้วยการใช้ DataReader
  31.         If e.KeyChar = Chr(13) Then
  32.             e.Handled = True
  33.             Call SearchDataReader()
  34.         End If
  35.     End Sub

  36.     ' / ----------------------------------------------------------------------------------------
  37.     ' / Show All Data with DATASET
  38.     Private Sub ListAllDataSet()
  39.         strSQL = _
  40.                 " SELECT Product.ProductPK, Product.ProductID, Product.ProductName, Product.Stocked, Product.UnitPrice " & _
  41.                 " FROM Product " & _
  42.                 " WHERE " & _
  43.                 " ProductID LIKE '%" & txtSearch.Text & "%'" & _
  44.                 " OR " & _
  45.                 " ProductName LIKE '%" & txtSearch.Text & "%'" & _
  46.                 " ORDER BY ProductPK, ProductID "
  47.         DS.Clear()
  48.         Try
  49.             ' ยัดใส่ตารางที่มาจากการทำ Query ให้กับ DataAdapter
  50.             DA = New OleDb.OleDbDataAdapter(strSQL, Conn)
  51.             DA.Fill(DS, "Product")
  52.             ' / --------------------------------------------------------------------------------
  53.             ' / B O U N D --- D A T A --- C O N T R O L
  54.             ' / Bind Data into DataGridView
  55.             dgvData.DataSource = DS.Tables("Product")
  56.             ' / --------------------------------------------------------------------------------
  57.             ' ตั้งค่าคุณสมบัติ DataGridView
  58.             Call SetupDataGrid()
  59.             lblRecordCount.Text = "[จำนวน : " & dgvData.RowCount & " รายการ.]"
  60.             DS.Dispose()
  61.             DA.Dispose()
  62.         Catch ex As Exception
  63.             MessageBox.Show(ex.Message)
  64.         End Try
  65.         txtSearch.Focus()
  66.         txtSearch.Text = ""
  67.     End Sub

  68.     ' / ----------------------------------------------------------------------------------------
  69.     ' / Search with DATAREADER
  70.     Private Sub SearchDataReader()
  71.         strSQL = _
  72.                 " SELECT Product.ProductPK, Product.ProductID, Product.ProductName, Product.Stocked, Product.UnitPrice " & _
  73.                 " FROM Product " & _
  74.                 " WHERE " & _
  75.                 " ProductID LIKE '%" & txtSearch.Text & "%'" & _
  76.                 " OR " & _
  77.                 " ProductName LIKE '%" & txtSearch.Text & "%'" & _
  78.                 " ORDER BY ProductPK, ProductID "
  79.         '//
  80.         Try
  81.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  82.             Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  83.             Dim Reader As OleDb.OleDbDataReader = Cmd.ExecuteReader
  84.             Dim DT As DataTable = New DataTable
  85.             DT.Load(Reader)
  86.             dgvData.DataSource = DT
  87.             DT.Dispose()
  88.             Call SetupDataGrid()

  89.         Catch ex As Exception
  90.             MessageBox.Show(ex.Message)
  91.         End Try
  92.         lblRecordCount.Text = "[จำนวน : " & dgvData.RowCount & " รายการ.]"
  93.         txtSearch.Text = ""
  94.         txtSearch.Focus()
  95.     End Sub

  96.     ' / --------------------------------------------------------------------------------
  97.     ' ตั้งค่าคุณสมบัติ DataGridView
  98.     Private Sub SetupDataGrid()
  99.         With dgvData
  100.             .RowHeadersVisible = True
  101.             .AllowUserToAddRows = False
  102.             .AllowUserToDeleteRows = False
  103.             .AllowUserToResizeRows = False
  104.             .MultiSelect = False
  105.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  106.             .ReadOnly = True
  107.             '// Data rows
  108.             .Font = New Font("Tahoma", 9)
  109.             .RowTemplate.MinimumHeight = 28
  110.             .RowTemplate.Height = 28
  111.             '// ซ่อนหลัก 0 ProductPK
  112.             .Columns(0).Visible = False
  113.             .Columns("ProductID").HeaderText = "รหัสสินค้า"
  114.             .Columns("ProductName").HeaderText = "ชื่อสินค้า"
  115.             With .Columns("Stocked")
  116.                 .HeaderText = "จำนวนที่มีอยู่"
  117.                 .DefaultCellStyle.Format = "n0"
  118.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  119.                 .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  120.             End With
  121.             With .Columns("UnitPrice")
  122.                 .HeaderText = "ราคาขาย"
  123.                 .DefaultCellStyle.Format = "n2"
  124.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  125.                 .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  126.             End With
  127.             '// Column Header
  128.             .ColumnHeadersHeight = 30
  129.             .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
  130.             '// Autosize Column
  131.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  132.             '// Even-Odd Color
  133.             '// แสดงสีสลับแถวคู่-คี่
  134.             .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
  135.             With .ColumnHeadersDefaultCellStyle
  136.                 .BackColor = Color.Navy
  137.                 .ForeColor = Color.Black
  138.                 .Font = New Font("Tahoma", 9, FontStyle.Bold)
  139.             End With
  140.         End With
  141.     End Sub

  142.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  143.         Me.Close()
  144.     End Sub


  145. End Class
คัดลอกไปที่คลิปบอร์ด

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

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

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

1

กระทู้

4

โพสต์

75

เครดิต

Member

Rank: 2

เครดิต
75
โพสต์ 2020-7-29 14:24:17 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2020-7-29 19:32:50 | ดูโพสต์ทั้งหมด


ขอบคุณครับ

1

กระทู้

3

โพสต์

59

เครดิต

Member

Rank: 2

เครดิต
59
โพสต์ 2020-8-2 13:50:35 | ดูโพสต์ทั้งหมด

ขอบคุณมากครับ

0

กระทู้

51

โพสต์

232

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
232
โพสต์ 2020-8-12 07:43:46 | ดูโพสต์ทั้งหมด

Oh ! ...  Yes s s ...  แมน ของ ที่ อยากได้ เลย..  ขอให้ร่ำรวยๆ อย่าเจ็บอย่าไข้ อยู่เป็นร่มโพธิร่มไทร ตลอดไป.. ขอบพระคุณอย่างสูงครับ อาจารย์ (คำได๋พิมพ์ผิด ขออภัยนำ คับ)

1

กระทู้

15

โพสต์

83

เครดิต

Member

Rank: 2

เครดิต
83
โพสต์ 2020-8-12 12:40:32 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

3

กระทู้

15

โพสต์

179

เครดิต

Member

Rank: 2

เครดิต
179
โพสต์ 2020-9-3 15:37:50 | ดูโพสต์ทั้งหมด

น่าจะมีแบบฐานข้อมูล Sql Server บ้างอ่ะคับจารย์มีแต่ Access สะส่วนใหญ่มือใหม่อ่านแล้วงงตืบ

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583
 เจ้าของ| โพสต์ 2020-9-3 15:50:27 | ดูโพสต์ทั้งหมด

maisurin ตอบกลับเมื่อ 2020-9-3 15:37
น่าจะมีแบบฐานข้อมูล Sql Server บ้างอ่ะคับจารย์มีแต่ Access สะส่วนใหญ่มือใหม่อ่านแล้วงงตืบ

โค้ดที่ใช้จะเหมือนกันหมดครับ ทั้ง Access และ SQL Server แตกต่างกันที่การ Connection และการเรียกใช้งานกลุ่มบรรดาคำสั่งของ ADO.NET เช่น DataAdapter, Command เป็นต้น เท่านั้นเอง แต่ที่งงๆกันน่ะ คือวิธีการเขียนโค้ดของผม ที่ไม่มีอยู่ในเว็บ หรือตามหนังสือครับผม 5555+
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2021-5-28 23:05:11 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2022-2-24 00:31:28 | ดูโพสต์ทั้งหมด

ขอบคุณคัพอาจารย์
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 23:41 , Processed in 0.295180 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้