|
ในแต่ละเซลล์ของตารางกริด (DataGridView) มันมีคุณสมบัติเป็นเหมือนกับ TextBox นั่นคือเราจะคีย์ค่าอะไรลงไปก็ได้ ... ทีนี้จากภาพประกอบด้านบน สมมุติว่าหลัก 0 (Primary Key) และหลัก 2 (นับค่า Column Index นะครับ) เป็น Number จะต้องป้อนเลขจำนวนเต็มเท่านั้น หรือหลัก 3 Double Field สามารถป้อนเลขแบบจำนวนทศนิยมได้เท่านั้นจะทำอย่างไร??? ... ที่ต้องมีการล็อคค่าการกดคีย์ หรือ Validate Cell ก็เพราะเราจะต้องนำค่าที่อยู่ในเซลล์นั้นๆไปทำการคำนวณ หรือ บันทึกลงฐานข้อมูล หากป้อนค่าอินพุทผิด ไม่ตรงตามชนิดข้อมูลที่ต้องการ มันก็จะทำให้เกิดเอ้อเหรอ (Error) ได้นั่นเอง ดังนั้นเราจึงต้องป้องกันเอาไว้ก่อนยังไงล่ะครับทั่นผู้ชม ...
ปัญหาสำหรับการป้อนตัวเลขจำนวนเต็มลงไปในเซลล์ของตารางกริด ก็คือ จะต้องล็อคไม่ให้กดค่าตัวอักษร หรืออักษรพิเศษลงไปได้ หากแก้ปัญหาข้อนี้ผ่าน ก็ไปต่อหลักที่ 3 ได้ แต่ทว่าการป้อนข้อมูลในหลักที่ 3 นี้ จะต้องสามารถคีย์เครื่องหมายจุดทศนิยมลงไปได้ แต่จะต้องใส่ได้เพียงจุดเดียวเท่านั้น ...
- ' / --------------------------------------------------------------------------------
- Private Sub dgvData_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
- Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Index
- '// ColumeIndex 0, 2 is Integer and ColumnIndex 3 is double.
- Case 0, 2, 3
- '// Force to validate value at ValidKeyPress Event.
- RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
- AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
- End Select
- End Sub
คัดลอกไปที่คลิปบอร์ด เราจะทำการตรวจสอบก่อนว่ามันอยู่ในหลักที่เราต้องการหรือไม่ ในที่นี้คือหลัก 0, 2 และ 3 ดังนั้นในการกดคีย์แต่ละครั้ง เราจะบังคับให้มันไปเช็คก่อนว่าจะรับคีย์หรือไม่ โดยสั่งไปที่เหตุการณ์ ValidKeyPress
- ' / --------------------------------------------------------------------------------
- Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
- Dim tb As TextBox = sender
- Select Case dgvData.CurrentCell.ColumnIndex
- Case 0, 2 '// Integer
- Select Case e.KeyChar
- Case "0" To "9" ' digits 0 - 9 allowed
- Case ChrW(Keys.Back) ' backspace allowed for deleting (Delete key automatically overrides)
- Case Else ' everything else ....
- '// True = CPU cancel the KeyPress event
- e.Handled = True '// and it's just like you never pressed a key at all
- End Select
- Case 3 '// Double
- Select Case e.KeyChar
- Case "0" To "9"
- '// Allowed "."
- Case "."
- '// But it can present "." only one.
- If InStr(tb.Text, ".") Then e.Handled = True
- Case ChrW(Keys.Back)
- Case Else
- e.Handled = True
- End Select
- End Select
- End Sub
คัดลอกไปที่คลิปบอร์ด ในหลัก 0 และ 2 จะเป็นการดักเฉพาะค่าตัวเลขเท่านั้น ส่วนหลัก 3 นอกจากจะรับค่าเฉพาะตัวเลขเท่านั้น จะต้องมีการตรวจสอบการกดคีย์เครื่องหมายจุดซ้ำอีกหรือไม่
มาดูโค้ดฉบับเต็ม ...
- ' / --------------------------------------------------------------------------------
- ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
- ' / eMail : thongkorn@hotmail.com
- ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
- ' / Facebook: http://www.facebook.com/g2gnet (for Thailand)
- ' / Facebook: http://www.facebook.com/commonindy (Worldwide)
- ' / Purpose: Validating keypress each cells DataGridView Control.
- ' / Microsoft Visual Basic .NET (2010)
- ' /
- ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
- ' / You can modify and/or distribute without to inform the developer.
- ' / --------------------------------------------------------------------------------
- Public Class frmDataGridValidCell
- Private Sub frmDataGridValidCell_Load(sender As Object, e As System.EventArgs) Handles Me.Load
- Call InitializeGrid()
- Call FillData()
- End Sub
- ' / --------------------------------------------------------------------------------
- Private Sub FillData()
- Dim dt As New DataTable
- dt.Columns.Add("Primary Key", GetType(Integer))
- dt.Columns.Add("ID")
- dt.Columns.Add("Number Field", GetType(Integer))
- dt.Columns.Add("Double Field", GetType(Double))
- '//
- Dim RandomClass As New Random()
- For i As Long = 0 To 5
- Dim dr As DataRow = dt.NewRow()
- dr(0) = i + 1
- dr(1) = "ID" & i + 1
- dr(2) = RandomClass.Next(1, 99999)
- dr(3) = FormatNumber(RandomClass.Next(100, 1000) + RandomClass.NextDouble(), 2)
- dt.Rows.Add(dr)
- Next
- dgvData.DataSource = dt
- End Sub
- ' / --------------------------------------------------------------------------------
- ' / Initialized settings for DataGridView @Run Time.
- ' / --------------------------------------------------------------------------------
- Private Sub InitializeGrid()
- With dgvData
- .RowHeadersVisible = False
- .AllowUserToAddRows = False
- .AllowUserToDeleteRows = False
- .AllowUserToResizeRows = False
- .MultiSelect = False
- '// Need to modify each cell.
- .SelectionMode = DataGridViewSelectionMode.CellSelect
- .ReadOnly = False
- '//
- .Font = New Font("Tahoma", 8)
- ' Automatically set the width.
- .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
- .AutoResizeColumns()
- ' Adjust Header Styles
- With .ColumnHeadersDefaultCellStyle
- .BackColor = Color.Navy
- .ForeColor = Color.White
- .Font = New Font("Tahoma", 8)
- End With
- End With
- End Sub
- ' / --------------------------------------------------------------------------------
- Private Sub dgvData_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
- Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Index
- '// ColumeIndex 0, 2 is Integer and ColumnIndex 3 is double.
- Case 0, 2, 3
- '// Force to validate value at ValidKeyPress Event.
- RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
- AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
- End Select
- End Sub
- ' / --------------------------------------------------------------------------------
- Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
- Dim tb As TextBox = sender
- Select Case dgvData.CurrentCell.ColumnIndex
- Case 0, 2 '// Integer
- Select Case e.KeyChar
- Case "0" To "9" ' digits 0 - 9 allowed
- Case ChrW(Keys.Back) ' backspace allowed for deleting (Delete key automatically overrides)
- Case Else ' everything else ....
- '// True = CPU cancel the KeyPress event
- e.Handled = True '// and it's just like you never pressed a key at all
- End Select
- Case 3 '// Double
- Select Case e.KeyChar
- Case "0" To "9"
- '// Allowed "."
- Case "."
- '// But it can present "." only one.
- If InStr(tb.Text, ".") Then e.Handled = True
- Case ChrW(Keys.Back)
- Case Else
- e.Handled = True
- End Select
- End Select
- End Sub
- Private Sub frmDataGridValidCell_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- Application.Exit()
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|