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

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

[VB.NET] การควบคุมตารางกริด (DataGridView) เพื่อจำลองการขายสินค้า

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

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6030

โค้ดชุดนี้เป็น การจำลองการขายสินค้า (Detail) เพื่อคำนวณจากจำนวนสินค้า X ราคาสินค้า ในแต่ละแถวข้อมูลของตารางกริด จากนั้นนำมาหาผลรวมยอดเงินทั้งหมด ซึ่งจะมีการเพิ่มแถว ลบแถวรายการได้ เพื่อจะให้เห็นผลลัพธ์ของการเปลี่ยนแปลง โดยที่ไม่ได้ติดต่อกับฐานข้อมูลใดๆเลย แต่ใช้ข้อมูลสมมุติขึ้นมา จุดประสงค์หลักของงานชิ้นนี้ ก็เพื่อเรียนรู้ในการควบคุมตารางกริด ในลักษณะที่เรียกว่า In Line Edit ซึ่งจะมีความเป็นมิตรกับผู้ใช้งาน (Friendly Use) ... เป็นการใช้โค้ดทั้งหมด หรือที่เรียกว่า Run Time ซึ่งจะทำให้เกิดความยืดหยุ่นในการปรับแต่งโปรแกรม







มาดูโค้ดต้นฉบับกันดีกว่า ...
  1. Public Class frmDetailDataGridView

  2.     ' / --------------------------------------------------------------------------------
  3.     '/ Don't forget to set Form has KeyPreview = True
  4.     Private Sub frmDetailDataGridView_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  5.         Select Case e.KeyCode
  6.             Case Keys.F7
  7.                 '/ Add Row
  8.                 Call btnAddRow_Click(sender, e)
  9.             Case Keys.F8
  10.                 '/ Remove Row
  11.                 Call btnRemoveRow_Click(sender, e)
  12.         End Select
  13.     End Sub

  14.     ' / --------------------------------------------------------------------------------
  15.     Private Sub frmDetailDataGridView_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  16.         Me.KeyPreview = True  '/ สามารถกดปุ่มฟังค์ชั่นคีย์ลงในฟอร์มได้
  17.         Call InitializeGrid()
  18.         '/
  19.         txtSumTotal.ReadOnly = True
  20.         txtSumTotal.Text = "0.00"
  21.     End Sub

  22.     ' / --------------------------------------------------------------------------------
  23.     Private Sub InitializeGrid()
  24.         With dgvData
  25.             .RowHeadersVisible = False
  26.             .AllowUserToAddRows = False
  27.             .AllowUserToDeleteRows = False
  28.             .AllowUserToResizeRows = False
  29.             .MultiSelect = False
  30.             .ReadOnly = False
  31.             .RowTemplate.MinimumHeight = 27
  32.             .RowTemplate.Height = 27
  33.             '/ Columns Specified
  34.             '/ Index = 0
  35.             .Columns.Add("PK", "Primary Key")
  36.             With .Columns("PK")
  37.                 .ReadOnly = True
  38.                 .DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  39.                 .Visible = True 'False '/ ปกติหลัก Primary Key จะต้องถูกซ่อนไว้
  40.             End With
  41.             '/ Index = 1
  42.             .Columns.Add("ProductID", "Product ID")
  43.             '/ Index = 2
  44.             .Columns.Add("ProductName", "Product Name")
  45.             '/ Index = 3
  46.             .Columns.Add("Quantity", "Quantity")
  47.             .Columns("Quantity").ValueType = GetType(Integer)
  48.             '/ Index = 4
  49.             .Columns.Add("UnitPrice", "Unit Price")
  50.             .Columns("UnitPrice").ValueType = GetType(Double)
  51.             '/ Index = 5
  52.             .Columns.Add("Total", "Total")
  53.             .Columns("Total").ValueType = GetType(Double)
  54.             .Font = New Font("Tahoma", 11)
  55.             '/ Total Column
  56.             With .Columns("Total")
  57.                 .ReadOnly = True
  58.                 .DefaultCellStyle.BackColor = Color.LightGoldenrodYellow
  59.                 .DefaultCellStyle.ForeColor = Color.Blue
  60.                 .DefaultCellStyle.Font = New Font(dgvData.Font, FontStyle.Bold)
  61.             End With
  62.             '/ Alignment MiddleRight only columns 3 to 5
  63.             For i As Byte = 3 To 5
  64.                 '/ Header Alignment
  65.                 .Columns(i).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  66.                 '/ Cell Alignment
  67.                 .Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  68.             Next
  69.             '/ Auto size column width of each main by sorting the field.
  70.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  71.             '/ Adjust Header Styles
  72.             With .ColumnHeadersDefaultCellStyle
  73.                 .BackColor = Color.RoyalBlue
  74.                 .ForeColor = Color.White
  75.                 .Font = New Font("Tahoma", 11, FontStyle.Bold)
  76.             End With
  77.             .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
  78.             .ColumnHeadersHeight = 36
  79.             '/ กำหนดให้ EnableHeadersVisualStyles = False เพื่อให้ยอมรับการเปลี่ยนแปลงสีพื้นหลังของ Header
  80.             .EnableHeadersVisualStyles = False
  81.         End With

  82.     End Sub

  83.     ' / --------------------------------------------------------------------------------
  84.     ' / Add new row
  85.     Private Sub btnAddRow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
  86.         Dim Position As Integer = dgvData.Rows.Count - 1
  87.         Dim PK As Integer = 1   '/ Initialize value if without rows.
  88.         '/ Get value at the last row
  89.         Dim LastRow As New DataGridViewRow
  90.         '/ ตรวจสอบค่าแถวสุดท้ายว่ามีค่า Primary Key เท่าไหร่ก็ให้บวก 1 (เป็นการจำลองการทำงาน โดยไม่ติดต่อกับ DataBase)
  91.         '/ กรณีใช้ฐานข้อมูลจริงๆ ให้ตัดส่วนนี้ทิ้งแล้วใช้ Primary Key ของสินค้าจากฐานข้อมูลแทน
  92.         If Position >= 0 Then
  93.             '/ ไปแถวสุดท้าย
  94.             LastRow = dgvData.Rows.OfType(Of DataGridViewRow).Last()
  95.             '/ จากนั้นให้เพิ่มค่าขึ้น +1 (Column Index = 0)
  96.             PK = LastRow.Cells(0).Value + 1
  97.         End If
  98.         Dim RandomClass As New Random()
  99.         '/ Sample data
  100.         '/ Primary Key, Product ID, Product Name, Quantity, UnitPrice, Total
  101.         Dim row As String() = New String() {PK, "PRO000" & PK, "Product " & PK, 1, Format(RandomClass.Next(1, 1000), "0.00"), "0.00"}
  102.         dgvData.Rows.Add(row)
  103.         '/ โฟกัสไปที่ Column(3) หรือ Quantity (จำนวน)
  104.         dgvData.CurrentCell = dgvData.Rows(dgvData.RowCount - 1).Cells(3)
  105.         dgvData.Focus()

  106.         '/ ไปคำนวณหาค่าผลรวม
  107.         Call CalSumTotal()
  108.     End Sub

  109.     ' / --------------------------------------------------------------------------------
  110.     ' / Remove select row
  111.     Private Sub btnRemoveRow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
  112.         If dgvData.RowCount = 0 Then Exit Sub
  113.         '/
  114.         dgvData.Rows.Remove(dgvData.CurrentRow)
  115.         dgvData.Refresh()
  116.         '/ เมื่อแถวรายการถูกลบออกไป และยังคงมีแถวรายการอยู่ ต้องไปคำนวณหาค่าผลรวมใหม่
  117.         If dgvData.RowCount > 0 Then Call CalSumTotal()
  118.     End Sub

  119.     ' / --------------------------------------------------------------------------------
  120.     ' / Calcualte sum of Total (Column Index = 5)
  121.     ' / ทำทุกครั้งที่มีการเพิ่มหรือลบแถวรายการ และมีการเปลี่ยนแปลงค่าในเซลล์ Quantity, UnitPrice
  122.     Private Sub CalSumTotal()
  123.         txtSumTotal.Text = "0.00"
  124.         '/ วนรอบตามจำนวนแถวที่มีอยู่ปัจจุบัน
  125.         For i As Integer = 0 To dgvData.RowCount - 1
  126.             '/ หลักสุดท้ายของตารางกริด = [จำนวน x ราคา]
  127.             dgvData.Rows(i).Cells(5).Value = Format(dgvData.Rows(i).Cells(3).Value * dgvData.Rows(i).Cells(4).Value, "#,##0.00")
  128.             '/ นำค่าจาก Total มารวมกันเพื่อแสดงผลในสรุปผลรวม (x = x + y)
  129.             txtSumTotal.Text = Format(CDbl(txtSumTotal.Text) + CDbl(dgvData.Rows(i).Cells(5).Value), "#,##0.00")
  130.         Next
  131.     End Sub

  132.     ' / --------------------------------------------------------------------------------
  133.     ' / After you press Enter
  134.     Private Sub dgvData_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit
  135.         '/ เกิดการเปลี่ยนแปลงค่าในหลัก Index ที่ 3 หรือ 4
  136.         Select Case e.ColumnIndex
  137.             Case 3, 4 '/ Column Index = 3 (Quantity), Column Index = 4 (UnitPrice)
  138.                 '/ Quantity
  139.                 '/ การดัก Error กรณีมีค่า Null Value ให้ใส่ค่า 0 ลงไปแทน
  140.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(3).Value) Then dgvData.Rows(e.RowIndex).Cells(3).Value = "0"
  141.                 Dim Quantity As Integer = dgvData.Rows(e.RowIndex).Cells(3).Value
  142.                 '/ UnitPrice
  143.                 '/ If Null Value
  144.                 If IsDBNull(dgvData.Rows(e.RowIndex).Cells(4).Value) Then dgvData.Rows(e.RowIndex).Cells(4).Value = "0.00"
  145.                 Dim UnitPrice As Double = dgvData.Rows(e.RowIndex).Cells(4).Value

  146.                 '/ Quantity x UnitPrice
  147.                 dgvData.Rows(e.RowIndex).Cells(5).Value = (Quantity * UnitPrice).ToString("#,##0.00")

  148.                 '/ Calculate Summary
  149.                 Call CalSumTotal()
  150.         End Select
  151.     End Sub

  152.     ' / --------------------------------------------------------------------------------
  153.     Private Sub dgvData_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
  154.         Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Name
  155.             ' / Can use both Colume Index or Field Name
  156.             Case "Quantity", "UnitPrice"
  157.                 '/ Stop and Start event handler
  158.                 RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
  159.                 AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
  160.         End Select
  161.     End Sub

  162.     ' / --------------------------------------------------------------------------------
  163.     Private Sub ValidKeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
  164.         Dim tb As TextBox = sender
  165.         Select Case dgvData.CurrentCell.ColumnIndex
  166.             Case 3  ' Quantity is Integer
  167.                 Select Case e.KeyChar
  168.                     Case "0" To "9"   ' digits 0 - 9 allowed
  169.                     Case ChrW(Keys.Back)    ' backspace allowed for deleting (Delete key automatically overrides)

  170.                     Case Else ' everything else ....
  171.                         ' True = CPU cancel the KeyPress event
  172.                         e.Handled = True ' and it's just like you never pressed a key at all
  173.                 End Select

  174.             Case 4  ' UnitPrice is Double
  175.                 Select Case e.KeyChar
  176.                     Case "0" To "9"
  177.                         ' Allowed "."
  178.                     Case "."
  179.                         ' can present "." only one
  180.                         If InStr(tb.Text, ".") Then e.Handled = True

  181.                     Case ChrW(Keys.Back)
  182.                         '/ Return False is Default value

  183.                     Case Else
  184.                         e.Handled = True

  185.                 End Select
  186.         End Select
  187.     End Sub

  188.     Private Sub frmDetailDataGridView_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  189.         Me.Dispose()
  190.         GC.SuppressFinalize(Me)
  191.         Application.Exit()
  192.     End Sub

  193. End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...


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

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

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

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

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

GMT+7, 2024-4-19 18:12 , Processed in 0.213296 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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