Cómo restringir la entrada del usuario a un par de valores en un DataGridView
Necesito encontrar una manera de restringir que el usuario ingrese algo que no sea1
o2
en una columna en mi dgv. Lo tengo para que el usuario esté restringido a ingresar un número, pero necesito más restricciones para cumplir con elFOREIGN KEY
restricciones
¿Algunas ideas?
Validación actual en el lugar:
Private Sub dgvCategories_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles dgvCategories.EditingControlShowing
CType(Me.dgvCategories.Columns(0), DataGridViewTextBoxColumn).MaxInputLength = 50
CType(Me.dgvCategories.Columns(1), DataGridViewTextBoxColumn).MaxInputLength = 1
End Sub
Private Sub dgvCategories_DataError(ByVal sender As Object, _
ByVal e As DataGridViewDataErrorEventArgs) _
Handles dgvCategories.DataError
If StrComp(e.Exception.Message, "Input string was not in a correct format.") = 0 Then
MessageBox.Show("Please Enter either 1 (Expense) or 2 (Income) in the Transaction Type column.")
'This will change the number back to original
dgvCategories.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = " "
End If
End Sub
Jugando con soluciones:
Dim CurValue As Integer
Private Sub dgvCategories_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCategories.CellEnter
CurValue = dgvCategories.Rows.Item(e.RowIndex).Cells(e.ColumnIndex).Value
End Sub
Private Sub dgvCategories_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCategories.CellEndEdit
Dim NewValue As Integer = dgvCategories.Rows.Item(e.RowIndex).Cells(e.ColumnIndex).Value
If NewValue < 1 Or NewValue > 2 Then
dgvCategories.Rows.Item(e.RowIndex).Cells(e.ColumnIndex).Value = CurValue
End If
End Sub
Me sale este error:Conversion from string "Unassigned" to type 'Integer' is not valid.
Lo que supongo es delNULL
entradas en la "Nueva fila" de la vista de cuadrícula de datos.
¿Alguna idea de cómo modificar esta solución?
EDITAR: Gracias a Nocturnal, cambié mi lógica a esto:
Private Function CleanInputNumber(ByVal str As String) As String
Return System.Text.RegularExpressions.Regex.Replace(str, "[03456789]", "1")
End Function
Private Sub xDataGridView_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
If DataGridView1.CurrentRow.Cells("ColumnType").IsInEditMode Then
Dim c As Control = DataGridView1.EditingControl
Select Case DataGridView1.Columns(e.ColumnIndex).Name
Case "ColumnType"
c.Text = CleanInputNumber(c.Text)
End Select
End If
End Sub
¡Funciona de maravilla!