lunes, 15 de marzo de 2010

Sólo números en columna de DataGridView

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 fuente

Option 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


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

1 comentario: