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

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

[VB.NET] การทำให้เซลล์ของตารางกริดรับค่าตัวเลขจำนวนเต็ม หรือจำนวนเลขทศนิยมได้เฉพาะหลักที่ต้องการ

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

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6030


ในแต่ละเซลล์ของตารางกริด (DataGridView) มันมีคุณสมบัติเป็นเหมือนกับ TextBox นั่นคือเราจะคีย์ค่าอะไรลงไปก็ได้ ... ทีนี้จากภาพประกอบด้านบน สมมุติว่าหลัก 0 (Primary Key) และหลัก 2 (นับค่า Column Index นะครับ) เป็น Number จะต้องป้อนเลขจำนวนเต็มเท่านั้น หรือหลัก 3 Double Field สามารถป้อนเลขแบบจำนวนทศนิยมได้เท่านั้นจะทำอย่างไร??? ... ที่ต้องมีการล็อคค่าการกดคีย์ หรือ Validate Cell ก็เพราะเราจะต้องนำค่าที่อยู่ในเซลล์นั้นๆไปทำการคำนวณ หรือ บันทึกลงฐานข้อมูล หากป้อนค่าอินพุทผิด ไม่ตรงตามชนิดข้อมูลที่ต้องการ มันก็จะทำให้เกิดเอ้อเหรอ (Error) ได้นั่นเอง ดังนั้นเราจึงต้องป้องกันเอาไว้ก่อนยังไงล่ะครับทั่นผู้ชม ...

ปัญหาสำหรับการป้อนตัวเลขจำนวนเต็มลงไปในเซลล์ของตารางกริด ก็คือ จะต้องล็อคไม่ให้กดค่าตัวอักษร หรืออักษรพิเศษลงไปได้ หากแก้ปัญหาข้อนี้ผ่าน ก็ไปต่อหลักที่ 3 ได้ แต่ทว่าการป้อนข้อมูลในหลักที่ 3 นี้ จะต้องสามารถคีย์เครื่องหมายจุดทศนิยมลงไปได้ แต่จะต้องใส่ได้เพียงจุดเดียวเท่านั้น ...
  1.     ' / --------------------------------------------------------------------------------
  2.     Private Sub dgvData_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
  3.         Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Index
  4.             '// ColumeIndex 0, 2 is Integer and ColumnIndex 3 is double.
  5.             Case 0, 2, 3
  6.                 '// Force to validate value at ValidKeyPress Event.
  7.                 RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
  8.                 AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
  9.         End Select
  10.     End Sub
คัดลอกไปที่คลิปบอร์ด
เราจะทำการตรวจสอบก่อนว่ามันอยู่ในหลักที่เราต้องการหรือไม่ ในที่นี้คือหลัก 0, 2 และ 3 ดังนั้นในการกดคีย์แต่ละครั้ง เราจะบังคับให้มันไปเช็คก่อนว่าจะรับคีย์หรือไม่ โดยสั่งไปที่เหตุการณ์ ValidKeyPress

  1.     ' / --------------------------------------------------------------------------------
  2.     Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
  3.         Dim tb As TextBox = sender
  4.         Select Case dgvData.CurrentCell.ColumnIndex
  5.             Case 0, 2  '// Integer
  6.                 Select Case e.KeyChar
  7.                     Case "0" To "9"   ' digits 0 - 9 allowed
  8.                     Case ChrW(Keys.Back)    ' backspace allowed for deleting (Delete key automatically overrides)
  9.                     Case Else ' everything else ....
  10.                         '// True = CPU cancel the KeyPress event
  11.                         e.Handled = True '// and it's just like you never pressed a key at all
  12.                 End Select

  13.             Case 3  '// Double
  14.                 Select Case e.KeyChar
  15.                     Case "0" To "9"
  16.                         '// Allowed "."
  17.                     Case "."
  18.                         '// But it can present "." only one.
  19.                         If InStr(tb.Text, ".") Then e.Handled = True

  20.                     Case ChrW(Keys.Back)
  21.                     Case Else
  22.                         e.Handled = True

  23.                 End Select
  24.         End Select
  25.     End Sub
คัดลอกไปที่คลิปบอร์ด
ในหลัก 0 และ 2 จะเป็นการดักเฉพาะค่าตัวเลขเท่านั้น ส่วนหลัก 3 นอกจากจะรับค่าเฉพาะตัวเลขเท่านั้น จะต้องมีการตรวจสอบการกดคีย์เครื่องหมายจุดซ้ำอีกหรือไม่

มาดูโค้ดฉบับเต็ม ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: http://www.facebook.com/g2gnet (for Thailand)
  6. ' / Facebook: http://www.facebook.com/commonindy (Worldwide)
  7. ' / Purpose: Validating keypress each cells DataGridView Control.
  8. ' / Microsoft Visual Basic .NET (2010)
  9. ' /
  10. ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------------
  13. Public Class frmDataGridValidCell

  14.     Private Sub frmDataGridValidCell_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  15.         Call InitializeGrid()
  16.         Call FillData()
  17.     End Sub

  18.     ' / --------------------------------------------------------------------------------
  19.     Private Sub FillData()
  20.         Dim dt As New DataTable
  21.         dt.Columns.Add("Primary Key", GetType(Integer))
  22.         dt.Columns.Add("ID")
  23.         dt.Columns.Add("Number Field", GetType(Integer))
  24.         dt.Columns.Add("Double Field", GetType(Double))
  25.         '//
  26.         Dim RandomClass As New Random()
  27.         For i As Long = 0 To 5
  28.             Dim dr As DataRow = dt.NewRow()
  29.             dr(0) = i + 1
  30.             dr(1) = "ID" & i + 1
  31.             dr(2) = RandomClass.Next(1, 99999)
  32.             dr(3) = FormatNumber(RandomClass.Next(100, 1000) + RandomClass.NextDouble(), 2)
  33.             dt.Rows.Add(dr)
  34.         Next
  35.         dgvData.DataSource = dt
  36.     End Sub

  37.     ' / --------------------------------------------------------------------------------
  38.     ' / Initialized settings for DataGridView @Run Time.
  39.     ' / --------------------------------------------------------------------------------
  40.     Private Sub InitializeGrid()
  41.         With dgvData
  42.             .RowHeadersVisible = False
  43.             .AllowUserToAddRows = False
  44.             .AllowUserToDeleteRows = False
  45.             .AllowUserToResizeRows = False
  46.             .MultiSelect = False
  47.             '// Need to modify each cell.
  48.             .SelectionMode = DataGridViewSelectionMode.CellSelect
  49.             .ReadOnly = False
  50.             '//
  51.             .Font = New Font("Tahoma", 8)
  52.             ' Automatically set the width.
  53.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  54.             .AutoResizeColumns()
  55.             ' Adjust Header Styles
  56.             With .ColumnHeadersDefaultCellStyle
  57.                 .BackColor = Color.Navy
  58.                 .ForeColor = Color.White
  59.                 .Font = New Font("Tahoma", 8)
  60.             End With
  61.         End With
  62.     End Sub

  63.     ' / --------------------------------------------------------------------------------
  64.     Private Sub dgvData_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
  65.         Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Index
  66.             '// ColumeIndex 0, 2 is Integer and ColumnIndex 3 is double.
  67.             Case 0, 2, 3
  68.                 '// Force to validate value at ValidKeyPress Event.
  69.                 RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
  70.                 AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
  71.         End Select
  72.     End Sub

  73.     ' / --------------------------------------------------------------------------------
  74.     Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
  75.         Dim tb As TextBox = sender
  76.         Select Case dgvData.CurrentCell.ColumnIndex
  77.             Case 0, 2  '// Integer
  78.                 Select Case e.KeyChar
  79.                     Case "0" To "9"   ' digits 0 - 9 allowed
  80.                     Case ChrW(Keys.Back)    ' backspace allowed for deleting (Delete key automatically overrides)
  81.                     Case Else ' everything else ....
  82.                         '// True = CPU cancel the KeyPress event
  83.                         e.Handled = True '// and it's just like you never pressed a key at all
  84.                 End Select

  85.             Case 3  '// Double
  86.                 Select Case e.KeyChar
  87.                     Case "0" To "9"
  88.                         '// Allowed "."
  89.                     Case "."
  90.                         '// But it can present "." only one.
  91.                         If InStr(tb.Text, ".") Then e.Handled = True

  92.                     Case ChrW(Keys.Back)
  93.                     Case Else
  94.                         e.Handled = True

  95.                 End Select
  96.         End Select
  97.     End Sub

  98.     Private Sub frmDataGridValidCell_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  99.         Me.Dispose()
  100.         Application.Exit()
  101.     End Sub

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

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

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

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

1

กระทู้

15

โพสต์

83

เครดิต

Member

Rank: 2

เครดิต
83
โพสต์ 2018-10-14 19:28:48 จากอุปกรณ์พกพา | ดูโพสต์ทั้งหมด

ขอบคุณครับเฮียกำลังมึนๆได้ที่อยู่พอดี

3

กระทู้

11

โพสต์

129

เครดิต

Member

Rank: 2

เครดิต
129
โพสต์ 2019-7-11 16:57:10 | ดูโพสต์ทั้งหมด

ทำไม คลิกเมาส์ขวา แล้ว Paste ได้ แต่กด ctrl+v ไม่ได้ครับ
รบกวนด้วยครับอาจารย์

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6030
 เจ้าของ| โพสต์ 2019-7-17 13:50:32 | ดูโพสต์ทั้งหมด

gp1619 ตอบกลับเมื่อ 2019-7-11 16:57
ทำไม คลิกเมาส์ขวา แล้ว Paste ได้ แต่กด ctrl+v ไม่ได้ครับ
รบกวนด้วยครับอาจารย์

มันเป็นขีดจำกัดของ DataGridView ของไมโครซอฟท์ครับ (ดูคีย์บอร์ดชอร์ทคัทที่สามารถใช้งานกับตารางกริดได้ที่นี่) ที่ไมโครซอฟท์ไม่ได้ทำ Control หรือ Component ต่างๆออกมาให้ดียอดเยี่ยมไปเลย ก็เพราะต้องการลดต้นทุนตัวเอง และเปิดโอกาสให้ค่ายอื่นๆที่เราเรียกว่า Third Party ได้เข้ามามีส่วนร่วมแทน สำหรับกรณี DataGridView ของไมโครซอฟท์ เราพัฒนามันไปต่อได้ยากและเสียเวลามาก แม้ว่าจะสามารถทำให้มันใช้ Ctrl+C, X หรือ V ได้ก็ตามทีเหอะ เพราะค่าในคลิปบอร์ดเราต้องนำมาเช็คตลอดว่า เวลาจะนำไปไว้ใช้ตามเซลล์ต่างๆนั้น มันมีชนิดข้อมูลเป็นแบบไหนกันแน่ ผมแนะนำให้ไปใช้ของฟรีอย่าง Syncfusion แทนครับ (ตรวจสอบการป้อนค่าในแต่ละเซลล์ GridGroupingControl ของฟรีจากค่าย Syncfusion)

โค้ดตัวอย่างที่ยังไม่เสร็จสมบูรณ์ในการใช้ ShortCut Key บนตัวตารางกริด ...
  1. Private Sub dgvData_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellClick
  2.         GetCol = e.ColumnIndex
  3.     End Sub
คัดลอกไปที่คลิปบอร์ด
  1.     '/ Declare Public Variable in this form.
  2.     Dim GetCol As Integer
  3.     Dim StrTemp As String = String.Empty
  4.     '// Form Events KeyDown
  5.     Private Sub HandleKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
  6.         '// Use for Ctrl + X
  7.         If Not IsDBNull(dgvData.CurrentRow.Cells(GetCol).Value) Then
  8.             StrTemp = dgvData.CurrentRow.Cells(GetCol).Value
  9.         End If

  10.         '// Ctrl + C (Copy)
  11.         If e.KeyCode = Keys.C AndAlso e.Modifiers = Keys.Control Then
  12.             Clipboard.SetText(dgvData.CurrentRow.Cells(GetCol).Value)

  13.             '// Ctrl + V (Paste)
  14.         ElseIf e.KeyCode = Keys.V AndAlso e.Modifiers = Keys.Control Then
  15.             '/ ก่อนวางแปะ ต้องเช็คค่าว่าเป็นเลขจำนวนเต็ม หรือมีจุดทศนิยมในหลักนั้นๆก่อนด้วย
  16.             '/ Get the data stored in the clipboard
  17.             Dim iData As IDataObject = Clipboard.GetDataObject()
  18.             '/ Check to see if the data is in a text format
  19.             If iData.GetDataPresent(DataFormats.Text) Then
  20.                 dgvData.CurrentRow.Cells(GetCol).Value = CType(iData.GetData(DataFormats.Text), String)
  21.                 SendKeys.Send("{ENTER}")
  22.             End If

  23.             '// Ctrl + X (Cut)
  24.         ElseIf e.KeyCode = Keys.X AndAlso e.Modifiers = Keys.Control Then
  25.             '/ ก่อนตัด ต้องเช็คก่อนว่าหลักนั้นเป็น String หรือไม่ หากใช่ให้ใส่ค่าว่างแทน
  26.             If Not IsNothing(StrTemp) Then
  27.                 Clipboard.SetText(dgvData.CurrentRow.Cells(GetCol).Value)
  28.                 dgvData.CurrentRow.Cells(GetCol).Value = 0
  29.                 SendKeys.Send("{ENTER}")
  30.             Else
  31.                 dgvData.CurrentRow.Cells(GetCol).Value = 0
  32.                 SendKeys.Send("{ENTER}")
  33.             End If
  34.         End If
  35.     End Sub
คัดลอกไปที่คลิปบอร์ด







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

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

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

GMT+7, 2024-4-19 19:51 , Processed in 0.190472 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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