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

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

[VB.NET] โค้ดในส่วนของรายละเอียดการขายสินค้า แบบไม่ต้องติดต่อกับฐานข้อมูล

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

311

กระทู้

502

โพสต์

6060

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6060



โค้ดในส่วนของการขายสินค้า เป็นงานต้นแบบเพื่ออธิบายให้เห็นถึงหลักการวิธีคิดของการนำข้อมูลรายการสินค้าเข้าไปเก็บไว้ในตารางกริด เพื่อทำการขายสินค้า ตามหลักการของฐานข้อมูลก็คือมี ความสัมพันธ์แบบ One To Many (ใบขายสินค้า 1 ใบ ขายสินค้าได้หลายชนิด) แต่แอดมินจะตัดส่วนในเรื่องฐานข้อมูลทิ้งออกไปก่อน เพื่อไม่ให้เกิดความสับสน โดยโค้ดชุดนี้จะแสดงให้เห็นถึงการขายแบบมาตรฐาน แบบแรกคือการที่มีสินค้า A แล้วให้รวมจำนวนสินค้า A ไว้ในรายการเดียว และอีกแบบคือสินค้าเดียวกันแต่แยกจำนวนสินค้าออกจากกัน และทั้ง 2 แบบจะสามารถแก้ไขข้อมูล เช่น ราคาหรือจำนวนสินค้าได้ในขณะที่ทำรายการ ซึ่งเราเรียกว่า In Line Edit ด้วยวิธีการนี้จะมีความเป็นมิตรกับผู้ใช้ (Friendly Use) และทั้งหมดนี้คือการทำงานที่เรียกว่า UnBound Data หรือการไม่ผูกฟิลด์ข้อมูลใดๆเอาไว้กับตารางกริด ทำให้เราสามารถควบคุมการทำงานของโปรแกรมได้ดี ปรับแต่งความยืดหยุ่นได้ตามใจชอบ ... แอดมินฝากเอาไปคิดเป็นการบ้าน เช่น กรณีที่ไม่ได้ขายแบบเงินสด จะเช็คสต็อกได้อย่างไร ...

การจำลองตารางข้อมูล (DataTable) เพื่อทำการทดสอบ โดยที่ไม่ต้องไปติดต่อกับฐานข้อมูลใดๆ ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / S A M P L E ... D A T A T A B L E (Products)
  3.     ' / --------------------------------------------------------------------------------
  4.     Function GetDataTable() As DataTable
  5.         '// Add Column
  6.         Dim DT As New DataTable
  7.         With DT.Columns
  8.             .Add("ProductPK", GetType(Integer)) '<< Index = 0
  9.             .Add("ProductID", GetType(String))    '<< 1
  10.             .Add("ProductName", GetType(String)) '<< 2
  11.             .Add("UnitPrice", GetType(Double)) '<< 3
  12.             '// ในส่วนของการรวมจำนวนเงิน (Total) จำนวน X ราคา เราจะไม่เก็บในฐานข้อมูลให้เปลืองพื้นที่ แต่จะให้โปรแกรมคำนวณให้แทน
  13.         End With
  14.         '// ... Add rows for data.
  15.         '/ ProductPK, ProductID, ProductName, UnitPrice
  16.         '/ เหมือนการ Query เพื่อนำเอาเฉพาะข้อมูลที่ต้องการมาใช้งานเท่านั้น
  17.         With DT.Rows
  18.             .Add(1, "01", "กาแฟร้อน", "50.00")
  19.             .Add(2, "02", "กาแฟเย็น", "60.00")
  20.             .Add(3, "03", "คาปูชิโน่", "75.00")
  21.             .Add(4, "04", "คาปูชิโน่ - ลาเต้", "80.00")
  22.             .Add(5, "05", "เอ็กซ์เพรสโซ่", "90.00")
  23.             .Add(6, "06", "Classic Chicken", "20.00")
  24.             .Add(7, "07", "Mexicana", "25.00")
  25.             .Add(8, "08", "Lemon Shrimp", "30.00")
  26.             .Add(9, "09", "Bacon", "40.00")
  27.             .Add(10, "10", "Spicy Shrimp", "45.00")
  28.             .Add(11, "11", "Tex Supreme", "50.00")
  29.             .Add(12, "12", "Fish", "55.00")
  30.             .Add(13, "13", "Pepsi Can", "20.00")
  31.             .Add(14, "14", "Coke Can", "20.00")
  32.             .Add(15, "15", "7Up Can", "20.00")
  33.             .Add(16, "16", "Pepsi 2 ลิตร", "50.00")
  34.             .Add(17, "17", "Coke 2 ลิตร", "50.00")
  35.             .Add(18, "18", "น้ำเปล่า", "15.00")
  36.             .Add(19, "19", "เหล้าเป็ก", "100.00")
  37.             .Add(20, "20", "เบียร์สิงห์ (กระป๋อง)", "50.00")
  38.         End With
  39.         Return DT
  40.     End Function
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Public Class frmPosDetail

  2.     Private Sub frmPosDetail_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  3.         Select Case e.KeyCode
  4.             Case Keys.F8
  5.                 '/ Remove Row
  6.                 Call DeleteRow("btnDelRow")
  7.         End Select
  8.     End Sub

  9.     ' / --------------------------------------------------------------------------------
  10.     ' / S T A R T ... H E R E
  11.     ' / --------------------------------------------------------------------------------
  12.     Private Sub frmPosDetail_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  13.         Me.KeyPreview = True  '/ สามารถกดปุ่มฟังค์ชั่นคีย์ลงในฟอร์มได้
  14.         Call InitializeGrid()
  15.         '// Set all TextBox Control to Zero and ReadOnly except txtSearch.
  16.         For Each tb As TextBox In Me.Controls.OfType(Of TextBox)()
  17.             If tb.Name <> "txtSearch" Then
  18.                 tb.Text = "0.00"
  19.                 tb.ReadOnly = True
  20.             End If
  21.         Next
  22.         With cmbTax
  23.             .Items.Add("None Vat")
  24.             .Items.Add("Include Vat (7%)")
  25.             .Items.Add("Exclude Vat (7%)")
  26.         End With
  27.         cmbTax.SelectedIndex = 1    '// Include VAT
  28.     End Sub

  29.     ' / --------------------------------------------------------------------------------
  30.     ' / S A M P L E ... D A T A T A B L E (Products)
  31.     ' / --------------------------------------------------------------------------------
  32.     Function GetDataTable() As DataTable
  33.         '// Add Column
  34.         Dim DT As New DataTable
  35.         With DT.Columns
  36.             .Add("ProductPK", GetType(Integer)) '<< Index = 0
  37.             .Add("ProductID", GetType(String))    '<< 1
  38.             .Add("ProductName", GetType(String)) '<< 2
  39.             .Add("UnitPrice", GetType(Double)) '<< 3
  40.             '// ในส่วนของการรวมจำนวนเงิน (Total) จำนวน X ราคา เราจะไม่เก็บในฐานข้อมูลให้เปลืองพื้นที่ แต่จะให้โปรแกรมคำนวณให้แทน
  41.         End With
  42.         '// ... Add rows for data.
  43.         '/ ProductPK, ProductID, ProductName, UnitPrice
  44.         '/ เหมือนการ Query เพื่อนำเอาเฉพาะข้อมูลที่ต้องการมาใช้งานเท่านั้น
  45.         With DT.Rows
  46.             .Add(1, "01", "กาแฟร้อน", "50.00")
  47.             .Add(2, "02", "กาแฟเย็น", "60.00")
  48.             .Add(3, "03", "คาปูชิโน่", "75.00")
  49.             .Add(4, "04", "คาปูชิโน่ - ลาเต้", "80.00")
  50.             .Add(5, "05", "เอ็กซ์เพรสโซ่", "90.00")
  51.             .Add(6, "06", "Classic Chicken", "20.00")
  52.             .Add(7, "07", "Mexicana", "25.00")
  53.             .Add(8, "08", "Lemon Shrimp", "30.00")
  54.             .Add(9, "09", "Bacon", "40.00")
  55.             .Add(10, "10", "Spicy Shrimp", "45.00")
  56.             .Add(11, "11", "Tex Supreme", "50.00")
  57.             .Add(12, "12", "Fish", "55.00")
  58.             .Add(13, "13", "Pepsi Can", "20.00")
  59.             .Add(14, "14", "Coke Can", "20.00")
  60.             .Add(15, "15", "7Up Can", "20.00")
  61.             .Add(16, "16", "Pepsi 2 ลิตร", "50.00")
  62.             .Add(17, "17", "Coke 2 ลิตร", "50.00")
  63.             .Add(18, "18", "น้ำเปล่า", "15.00")
  64.             .Add(19, "19", "เหล้าเป็ก", "100.00")
  65.             .Add(20, "20", "เบียร์สิงห์ (กระป๋อง)", "50.00")
  66.         End With
  67.         Return DT
  68.     End Function

  69.     ' / --------------------------------------------------------------------------------
  70.     ' / ตั้งค่าเริ่มต้นให้กับ DataGridView แบบ Run Time (ใช้โค้ดทั้งหมด)
  71.     Private Sub InitializeGrid()
  72.         With dgvData
  73.             .RowHeadersVisible = False
  74.             .AllowUserToAddRows = False
  75.             .AllowUserToDeleteRows = False
  76.             .AllowUserToResizeRows = False
  77.             .MultiSelect = False
  78.             .ReadOnly = False
  79.             .RowTemplate.MinimumHeight = 27
  80.             .RowTemplate.Height = 27
  81.             '// Declare columns type.
  82.             Dim PK As New DataGridViewTextBoxColumn()
  83.             Dim ProductID As New DataGridViewTextBoxColumn()
  84.             Dim ProductName As New DataGridViewTextBoxColumn()
  85.             Dim Quantity As New DataGridViewTextBoxColumn()
  86.             Dim UnitPrice As New DataGridViewTextBoxColumn()
  87.             Dim Total As New DataGridViewTextBoxColumn()
  88.             '// Add new Columns
  89.             dgvData.Columns.AddRange(New DataGridViewColumn() { _
  90.                                      PK, ProductID, ProductName, Quantity, UnitPrice, Total _
  91.                                     })
  92.             '/ Index = 0
  93.             With PK
  94.                 .Name = "PK"
  95.                 .HeaderText = "PK"
  96.                 .Visible = False
  97.             End With
  98.             '/ Index = 1
  99.             With ProductID
  100.                 .Name = "ProductID"
  101.                 .HeaderText = "Product ID"
  102.                 .ReadOnly = True
  103.                 .DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  104.             End With
  105.             '/ Index = 2
  106.             With ProductName
  107.                 .Name = "ProductName"
  108.                 .HeaderText = "Product Name"
  109.                 .ReadOnly = True
  110.                 .DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  111.             End With
  112.             '/ Index = 3
  113.             With Quantity
  114.                 .Name = "Quantity"
  115.                 .HeaderText = "Quantity"
  116.                 .ValueType = GetType(Integer)
  117.             End With
  118.             '/ Index = 4
  119.             With UnitPrice
  120.                 .Name = "UnitPrice"
  121.                 .HeaderText = "Unit Price"
  122.                 .ValueType = GetType(Double)
  123.             End With
  124.             '/ Index = 5
  125.             With Total
  126.                 .Name = "Total"
  127.                 .HeaderText = "Total"
  128.                 .ValueType = GetType(Double)
  129.                 .ReadOnly = True
  130.                 .ReadOnly = True
  131.                 .DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  132.                 .DefaultCellStyle.ForeColor = Color.Blue
  133.                 .DefaultCellStyle.Font = New Font(dgvData.Font, FontStyle.Bold)
  134.             End With
  135.             '// เพิ่มปุ่มลบ (Index = 6)
  136.             Dim btnDelRow As New DataGridViewButtonColumn
  137.             dgvData.Columns.Add(btnDelRow)
  138.             With btnDelRow
  139.                 .HeaderText = "Delete F8"
  140.                 .Text = "Delete"
  141.                 .UseColumnTextForButtonValue = True
  142.                 .Width = 30
  143.                 .ReadOnly = True
  144.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
  145.                 .SortMode = DataGridViewColumnSortMode.NotSortable  '/ Not sort order but can click header for delete row.
  146.             End With
  147.             '/ Alignment MiddleRight only columns 3 to 5
  148.             For i As Byte = 3 To 5
  149.                 '/ Header Alignment
  150.                 .Columns(i).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  151.                 '/ Cell Alignment
  152.                 .Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  153.             Next
  154.             '/ Auto size column width of each main by sorting the field.
  155.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  156.             '/ Adjust Header Styles
  157.             With .ColumnHeadersDefaultCellStyle
  158.                 .BackColor = Color.RoyalBlue
  159.                 .ForeColor = Color.White
  160.                 .Font = New Font("Tahoma", 11, FontStyle.Bold)
  161.             End With
  162.             .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
  163.             .ColumnHeadersHeight = 36
  164.             '/ กำหนดให้ EnableHeadersVisualStyles = False เพื่อให้ยอมรับการเปลี่ยนแปลงสีพื้นหลังของ Header
  165.             .EnableHeadersVisualStyles = False
  166.         End With
  167.     End Sub

  168.     ' / --------------------------------------------------------------------------------
  169.     ' / การค้นหาข้อมูลในช่อง TextBox และค้นหาว่ามีข้อมูลรายการสินค้าอยู่ในแถวรายการตารางกริดหรือไม่
  170.     ' / หากไม่มี ก็ให้เพิ่มแถวเข้าไปใหม่
  171.     ' / หากมี ก็ให้เพิ่มจำนวนขึ้นไปอีก 1 Unit.
  172.     ' / --------------------------------------------------------------------------------
  173.     Private Sub txtSearch_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtSearch.KeyPress
  174.         '// เมื่อกดคีย์ ENTER เพื่อเริ่มต้นการค้นหาข้อมูล
  175.         If e.KeyChar = Chr(13) Then
  176.             '/ Replace some word for reserved in DataBase.
  177.             txtSearch.Text = txtSearch.Text.Trim.Replace("'", "").Replace("*", "").Replace("%", "")
  178.             e.Handled = True    '// ปิดเสียง
  179.             '/ สร้าง DataTable สมมุติขึ้นมา (เหมือนกับการดึงข้อมูลจาก DataBase เข้ามาเพื่อทำการค้นหา)
  180.             Dim DT As DataTable = GetDataTable()
  181.             '/ ค้นหาข้อมูลจาก DataTable แล้วรับค่ามาใส่ไว้ใน DataRow
  182.             '/ การค้นหาข้อมูลแบบ String จะต้องใส่เครื่องหมาย Single Quote ครอบเอาไว้ เช่น ProductID = '01'
  183.             Dim r() As DataRow = DT.Select(" ProductID = " & "'" & txtSearch.Text.Trim & "'")
  184.             '// หากพบข้อมูลใน DataTable
  185.             If r.Count > 0 Then
  186.                 '/ ตัวแปรบูลีน Flag แจ้งการค้นหาข้อมูลในตารางกริด (True = พบรายการในแถว, False = ไม่พบ)
  187.                 Dim blnExist As Boolean = False
  188.                 '/ หากนับจำนวนรวมสินค้าชนิดเดียวกันใน 1 รายการ (ไม่ติ๊กเครื่องหมายถูกใน CheckBox)
  189.                 '/ หากต้องการให้นับจำนวนรวมอย่างเดียวเท่านั้น ก็ตัดในส่วน IF - END IF และ CheckBox ทิ้งออกไปได้เลย
  190.                 If Not chkSeparateQty.Checked Then
  191.                     '/ ต้องค้นหาข้อมูลจากตารางกริดก่อน เพื่อค้นหาว่ามีรายการสินค้าเดิมหรือไม่?
  192.                     '/ หากในตารางกริดยังไม่มีแถวรายการ ก็จะข้าม For Loop นี้ไปเพิ่มรายการใหม่ทันที
  193.                     For iRow As Integer = 0 To dgvData.RowCount - 1
  194.                         '/ ทดสอบด้วย Primary Key r(0).Item(0) หรือ Product ID r(0).Item(1) ก็ได้
  195.                         If r(0).Item(0) = dgvData.Rows(iRow).Cells(0).Value Then
  196.                             '/ เมื่อพบรายการเดิม ก็ให้เพิ่มจำนวนขึ้น 1
  197.                             dgvData.Rows(iRow).Cells(3).Value += 1
  198.                             '/ Flag แจ้งว่าพบข้อมูลเดิมแล้ว
  199.                             blnExist = True
  200.                             '/ เมื่อเจอสินค้าเดิมในตารางกริดแล้ว ไม่ว่าจะอยู่แถวลำดับที่เท่าไหร่ ก็ให้ออกจาก For Loop การค้นหาได้เลย
  201.                             '/ เพราะรายการสินค้าใดๆ จะต้องมีอยู่เพียงแค่รายการเดียว ไม่ต้องเสียเวลาวนรอบกลับไปทำให้จนครบจำนวนแถว
  202.                             Exit For
  203.                         End If
  204.                     Next
  205.                 End If
  206.                 '/ กรณีที่พบสินค้าในตารางกริด กำหนด blnExist = True ทำให้ Not True = False จะทำให้ข้ามเงื่อนไขนี้ออกไป
  207.                 '/ กรณีที่ไม่พบข้อมูลสินค้าเดิมในตารางกริด กำหนด blnExist = False ทำให้ Not False = True เพิ่มรายการสินค้าแถวใหม่เข้าไปในตารางกริดได้
  208.                 If Not blnExist Then
  209.                     '/ เขียนเอาไว้หน่อยจะได้ไม่ลืมว่าแต่ละหลักเราเก็บค่าอะไร
  210.                     '/ Primary Key, Product ID, Product Name, Quantity, UnitPrice, Total
  211.                     dgvData.Rows.Add(r(0).Item(0), r(0).Item(1), r(0).Item(2), "1", Format(CDbl(r(0).Item(3).ToString), "0.00"), "0.00")
  212.                 End If
  213.                 '/ หากไม่ใช้ NOT ก็จะต้องเขียนโปรแกรมแบบนี้ แต่โค้ดจะไม่สวยงาม
  214.                 '/ If blnExist = True Then
  215.                 '/     ไม่ต้องทำอะไร
  216.                 '/ Else
  217.                 '/     ทำคำสั่งเพิ่มรายการแถว
  218.                 '/ End If
  219.                 '// คำนวณผลรวมใหม่
  220.                 DT.Dispose()
  221.                 Call CalSumTotal()
  222.             End If
  223.             txtSearch.Clear()
  224.             txtSearch.Focus()
  225.         End If
  226.     End Sub

  227.     ' / --------------------------------------------------------------------------------
  228.     ' / Calcualte sum of Total (Column Index = 5)
  229.     ' / ทำทุกครั้งที่มีการเพิ่ม/ลบแถวรายการ หรือมีการเปลี่ยนแปลงค่าในเซลล์ Quantity, UnitPrice
  230.     ' / เพื่อคำนวณหาจำนวนเงินใหม่
  231.     Private Sub CalSumTotal()
  232.         txtTotal.Text = "0.00"
  233.         '/ วนรอบตามจำนวนแถวที่มีอยู่ปัจจุบัน
  234.         For i As Integer = 0 To dgvData.RowCount - 1
  235.             '/ หลักสุดท้ายของตารางกริด = [จำนวน x ราคา]
  236.             dgvData.Rows(i).Cells(5).Value = Format(dgvData.Rows(i).Cells(3).Value * dgvData.Rows(i).Cells(4).Value, "#,##0.00")
  237.             '/ นำค่าจาก Total มารวมกันเพื่อแสดงผลในสรุปผลรวม (x = x + y)
  238.             txtTotal.Text = Format(CDbl(txtTotal.Text) + CDbl(dgvData.Rows(i).Cells(5).Value), "#,##0.00")
  239.         Next
  240.         '// TAX - การคิดภาษี
  241.         Dim SumPrice As Double = CDbl(txtTotal.Text)
  242.         Select Case cmbTax.SelectedIndex
  243.             '// ไม่คิดภาษี
  244.             Case 0
  245.                 txtTotal.Text = Format(SumPrice, "#,##0.00")
  246.                 txtVat.Text = "0.00"
  247.                 '// รวมจำนวนเงินทั้งหมด
  248.                 txtNetTotal.Text = Format(CDbl(txtTotal.Text), "#,##0.00")
  249.                 '// หรือ txtNetTotal.Text = Format(SumPrice, "#,##0.00")

  250.                 '// รวมภาษี (Include Tax)
  251.             Case 1
  252.                 '// คิดภาษี 7% (Include VAT)
  253.                 txtVat.Text = Format(SumPrice - (SumPrice / 1.07), "#,##0.00")
  254.                 '// หาราคาสินค้าที่แท้จริงก่อน ... โดยเอาราคาสินค้าทั้งหมดลบออกจากภาษี
  255.                 txtTotal.Text = Format(SumPrice - CDbl(txtVat.Text), "#,##0.00")
  256.                 '// รวมจำนวนเงินทั้งหมด
  257.                 txtNetTotal.Text = Format(SumPrice, "#,##0.00")

  258.                 '// แยกภาษี (Exclude Tax)
  259.             Case 2
  260.                 txtTotal.Text = Format(SumPrice, "#,##0.00")
  261.                 '// คิดแยกภาษี 7% (Exclude VAT)
  262.                 txtVat.Text = Format(CDbl(txtTotal.Text) * 7 / 100, "#,##0.00")
  263.                 '// รวมจำนวนเงินทั้งหมด + ภาษี
  264.                 txtNetTotal.Text = Format(CDbl(txtTotal.Text) + CDbl(txtVat.Text), "#,##0.00")
  265.         End Select
  266.     End Sub

  267.     ' / --------------------------------------------------------------------------------
  268.     ' / โปรแกรมย่อยในการลบแถวรายการที่เลือกออกไป
  269.     ' / --------------------------------------------------------------------------------
  270.     Private Sub DeleteRow(ByVal ColName As String)
  271.         If dgvData.RowCount = 0 Then Return
  272.         '/ ColName เป็นชื่อของหลัก Index = 6 ของตารางกริด (ไปดูที่โปรแกรมย่อย InitializeGrid)
  273.         If ColName = "btnDelRow" Then
  274.             '// ลบรายการแถวที่เลือกออกไป
  275.             dgvData.Rows.Remove(dgvData.CurrentRow)
  276.             '/ เมื่อแถวรายการถูกลบออกไป ต้องไปคำนวณหาค่าผลรวมใหม่
  277.             Call CalSumTotal()
  278.         End If
  279.         txtSearch.Focus()
  280.     End Sub

  281.     Private Sub dgvData_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellClick
  282.         Select Case e.ColumnIndex
  283.             '// Delete Button
  284.             Case 6
  285.                 'MsgBox(("Row : " + e.RowIndex.ToString & "  Col : ") + e.ColumnIndex.ToString)
  286.                 Call DeleteRow("btnDelRow")
  287.         End Select
  288.     End Sub

  289.     ' / --------------------------------------------------------------------------------
  290.     ' / เหตุการณ์นี้จะเกิดขึ้นเมื่อแก้ไขรายการในเซลล์เรียบร้อยแล้วกด Enter
  291.     ' / --------------------------------------------------------------------------------
  292.     Private Sub dgvData_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit
  293.         '/ เกิดการเปลี่ยนแปลงค่าในหลัก Index ที่ 3 หรือ 4
  294.         '/ ให้คำนวณราคารวมใหม่ จำนวน X ราคา
  295.         Select Case e.ColumnIndex
  296.             '/ Column Index = 3 (Quantity), Column Index = 4 (UnitPrice)
  297.             Case 3, 4
  298.                 '/ Quantity
  299.                 '/ การดัก Error กรณีมีค่า Null Value ให้ใส่ค่า 0 ลงไปแทน
  300.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(3).Value) Then dgvData.Rows(e.RowIndex).Cells(3).Value = "0"
  301.                 Dim Quantity As Integer = dgvData.Rows(e.RowIndex).Cells(3).Value
  302.                 '/ UnitPrice
  303.                 '/ If Null Value
  304.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(4).Value) Then dgvData.Rows(e.RowIndex).Cells(4).Value = "0.00"
  305.                 Dim UnitPrice As Double = dgvData.Rows(e.RowIndex).Cells(4).Value
  306.                 dgvData.Rows(e.RowIndex).Cells(4).Value = Format(CDbl(dgvData.Rows(e.RowIndex).Cells(4).Value), "0.00")

  307.                 '/ Quantity x UnitPrice
  308.                 dgvData.Rows(e.RowIndex).Cells(5).Value = CDbl((Quantity * UnitPrice).ToString("#,##0.00"))
  309.                 '/ Calculate Summary
  310.                 Call CalSumTotal()
  311.         End Select
  312.     End Sub

  313.     ' / --------------------------------------------------------------------------------
  314.     ' / เมื่อเริ่มกดคีย์ในหลักที่ 3 และ 4 (Quantity, UnitPrice)
  315.     ' / --------------------------------------------------------------------------------
  316.     Private Sub dgvData_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
  317.         '// อย่าลืมกำหนดชื่อ Column Name มาก่อนหน้านี้ด้วย (โปรแกรมย่อย InitializeGrid)
  318.         Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Name
  319.             ' / Can use both Colume Index or Field Name
  320.             Case "Quantity", "UnitPrice"
  321.                 '/ Stop and Start event handler.
  322.                 RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
  323.                 AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
  324.         End Select
  325.     End Sub

  326.     ' / --------------------------------------------------------------------------------
  327.     ' / ดักค่าการกดคีย์เฉพาะตัวเลขเท่านั้น
  328.     ' / --------------------------------------------------------------------------------
  329.     Private Sub ValidKeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
  330.         Dim tb As TextBox = sender
  331.         Select Case dgvData.CurrentCell.ColumnIndex
  332.             Case 3  ' Quantity is Integer (กรณีเลขจำนวนเต็ม)
  333.                 Select Case e.KeyChar
  334.                     Case "0" To "9"   ' digits 0 - 9 allowed
  335.                     Case ChrW(Keys.Back)    ' backspace allowed for deleting (Delete key automatically overrides)

  336.                     Case Else ' everything else ....
  337.                         ' True = CPU cancel the KeyPress event
  338.                         e.Handled = True ' and it's just like you never pressed a key at all
  339.                 End Select

  340.             Case 4  ' UnitPrice is Double (กรณีเลขจำนวนทศนิยม)
  341.                 Select Case e.KeyChar
  342.                     Case "0" To "9"
  343.                         ' Allowed "."
  344.                     Case "."
  345.                         ' can present "." only one
  346.                         If InStr(tb.Text, ".") Then e.Handled = True

  347.                     Case ChrW(Keys.Back)
  348.                         '/ Return False is Default value

  349.                     Case Else
  350.                         e.Handled = True

  351.                 End Select
  352.         End Select
  353.     End Sub

  354.     ' / --------------------------------------------------------------------------------
  355.     ' / เลือกการคำนวณภาษี
  356.     ' / --------------------------------------------------------------------------------
  357.     Private Sub cmbTax_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbTax.SelectedIndexChanged
  358.         Call CalSumTotal()
  359.         txtSearch.Focus()
  360.     End Sub

  361.     ' / --------------------------------------------------------------------------------
  362.     ' / หากติ๊กเครื่องหมายถูกคือการขายแบบแยกจำนวนสินค้า
  363.     ' / --------------------------------------------------------------------------------
  364.     Private Sub chkSeparateQty_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkSeparateQty.CheckedChanged
  365.         If chkSeparateQty.Checked Then
  366.             '// ปรับจำนวนให้เหลือ 1
  367.             'For i As Integer = 0 To dgvData.RowCount - 1
  368.             'dgvData.Rows(i).Cells(3).Value = "1"
  369.             'Next
  370.             '// หรือลบรายการทั้งหมดออกไปก่อน
  371.             dgvData.Rows.Clear()
  372.             Call CalSumTotal()
  373.             dgvData.Columns("Quantity").ReadOnly = True
  374.             dgvData.Columns("Quantity").DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  375.         Else
  376.             '// ลบรายการทั้งหมดออกไปก่อน
  377.             dgvData.Rows.Clear()
  378.             '/ สามารถคีย์จำนวนรายการได้
  379.             dgvData.Columns("Quantity").ReadOnly = False
  380.             dgvData.Columns("Quantity").DefaultCellStyle.BackColor = Color.White
  381.         End If
  382.         txtSearch.Focus()
  383.     End Sub

  384.     Private Sub frmPosDetail_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  385.         Me.Dispose()
  386.         GC.SuppressFinalize(Me)
  387.         Application.Exit()
  388.     End Sub

  389.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  390.         Me.Close()
  391.     End Sub
คัดลอกไปที่คลิปบอร์ด

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

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

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

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

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

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

GMT+7, 2024-4-30 01:14 , Processed in 0.207460 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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