Ejemplo para limitar la edición de datos de una o varias columnas de un control DataGridview para ingresar solo valores de tipo numérico
En el ejemplo se llena la grilla con cuatro columnas, donde la columna 1 y la columna 3 es para entrada de solo números.
Nota: en el evento KeyPress donde se verifca el caracter, ahi se debe indicar el índice de columna en el cual solo se ingresarán números.
Crear un nuevo proyecto, añadir un windows Form, un control DataGridView llamado DataGridview1
Código fuenteOption Explicit On
Option Strict On
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles MyBase.Load
' llenar la cuadricula con valores
With DataGridView1
.Columns.Clear()
' agregar cabeceras
.Columns.Add("Productos", "Productos")
.Columns.Add("stock", "stock Actual")
.Columns.Add("Fecha", "Fecha")
.Columns.Add("Id", "Id Proveedor")
Dim random_stock As New Random
' agregar filas
For i As Integer = 1 To 20
.Rows.Add("Producto n° " & i,random_stock.Next(25, _500),Date.Now.AddDays(i).ToShortDateString,i)
Next
' Bloquear la Columna fecha
.Columns("fecha").ReadOnly = True
End With
End Sub
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
' referencia a la celda
Dim validar As TextBox = CType(e.Control, TextBox)
' agregar el controlador de eventos para el KeyPress
AddHandler validar.KeyPress, AddressOf validar_Keypress
End Sub
' evento Keypress
' '''''''''''''''''''
Private Sub validar_Keypress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs)
' obtener indice de la columna
Dim columna As Integer = DataGridView1.CurrentCell.ColumnIndex
' comprobar si la celda en edición corresponde a la columna 1 o 3
If columna = 1 Or columna = 3 Then
' Obtener caracter
Dim caracter As Char = e.KeyChar
' comprobar si el caracter es un número o el retroceso
If Not Char.IsNumber(caracter) And (caracter = ChrW(Keys.Back)) = False Then
'Me.Text = e.KeyChar
e.KeyChar = Chr(0)
End If
End If
End Sub
End Class
Option Strict On
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles MyBase.Load
' llenar la cuadricula con valores
With DataGridView1
.Columns.Clear()
' agregar cabeceras
.Columns.Add("Productos", "Productos")
.Columns.Add("stock", "stock Actual")
.Columns.Add("Fecha", "Fecha")
.Columns.Add("Id", "Id Proveedor")
Dim random_stock As New Random
' agregar filas
For i As Integer = 1 To 20
.Rows.Add("Producto n° " & i,random_stock.Next(25, _500),Date.Now.AddDays(i).ToShortDateString,i)
Next
' Bloquear la Columna fecha
.Columns("fecha").ReadOnly = True
End With
End Sub
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
' referencia a la celda
Dim validar As TextBox = CType(e.Control, TextBox)
' agregar el controlador de eventos para el KeyPress
AddHandler validar.KeyPress, AddressOf validar_Keypress
End Sub
' evento Keypress
' '''''''''''''''''''
Private Sub validar_Keypress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs)
' obtener indice de la columna
Dim columna As Integer = DataGridView1.CurrentCell.ColumnIndex
' comprobar si la celda en edición corresponde a la columna 1 o 3
If columna = 1 Or columna = 3 Then
' Obtener caracter
Dim caracter As Char = e.KeyChar
' comprobar si el caracter es un número o el retroceso
If Not Char.IsNumber(caracter) And (caracter = ChrW(Keys.Back)) = False Then
'Me.Text = e.KeyChar
e.KeyChar = Chr(0)
End If
End If
End Sub
End Class
Ejemplo para poder aceptar el separador decimal para los números
Dim columna As Integer = DataGridView1.CurrentCell.ColumnIndex
' verificar columna actual
If columna = 1 Or columna = 3 Then
Dim caracter As Char = e.KeyChar
' referencia a la celda
Dim txt As TextBox = CType(sender, TextBox)
' comprobar si es un número con isNumber, si es el backspace, si el caracter
' es el separador decimal, y que no contiene ya el separador
If (Char.IsNumber(caracter)) Or (caracter = ChrW(Keys.Back)) Or _
(caracter = ",") And (txt.Text.Contains(",") = False) Then
e.Handled = False
Else
e.Handled = True
End If
End If
Excelente, funciona muy bien GRACIAS!!
ResponderEliminar