如果char重复则返回false



我在DataGridView中编码,并验证单元格是否只有数字和逗号的格式,单元格用于文档页面,示例格式将返回true,或接受:1,2或1,2,5 BUT NOT 1,,2或1…6,2

我已经做了一个函数,它工作得很好,但我不舒服使用我的代码,我希望有一个更好的代码比我有。

请纠正我的代码更好。

谢谢。

Private Function isCELLPageNumb(ByRef valyo As String, ByVal origMaxPage As String) As Boolean
    If valyo = "0" Or valyo = "," Then
        valyo = origMaxPage 
        Return False
    End If
    Dim allowedChars As String = "0123456789,"
    For i As Integer = (valyo.Length - 1) To 0 Step -1
        If allowedChars.IndexOf(valyo(i)) = -1 Then
            valyo = origMaxPage 
            Return False
        End If
        Try
            If valyo(i) = "," Then
                If valyo(i + 1) = "," Then
                    valyo = origMaxPage 
                    Return False
                End If
            End If
        Catch ex As Exception
            valyo = origMaxPage 
            Return False
        End Try
        ''I THINK I HAVE TO SEE IF THE COMMA NEXT NUMBER IS GREATER THAN THE MAXPAGE
        ''If valyo(i)>origMaxPage then
        ''End If 
    Next
    Return True
End Function

编辑的origMaxPage

Private Function isCELLPageNumb(ByRef valyo As String, ByVal origMaxPage As String) As Boolean
    If valyo = "0" Or valyo = "," Then
        valyo = origMaxPage
        Return False
    End If

    Dim allowedChars As String = "0123456789,"
    For i As Integer = (valyo.Length - 1) To 0 Step -1
        ''IF ALLOWED CHARACTERS NOT IN THE INDEX
        If allowedChars.IndexOf(valyo(i)) = -1 Then
            valyo = origMaxPage
            Return False
        End If
        Try
            ''IF VALYO IS COMMA REPEATED
            If valyo(i) = "," Then
                If valyo(i + 1) = "," Then
                    valyo = origMaxPage
                    Return False
                End If
            End If
        Catch ex As Exception
            valyo = origMaxPage
            Return False
        End Try
        Try
            ''IF VALYO GREATHER THAN THE MAXPAGE
            If valyo(i) = "," Then
                Dim twodigit As String = valyo(i + 1) & valyo(i + 2)
                Dim numtwodigit As UInt32 = Val(twodigit)
                If numtwodigit > origMaxPage Then
                    valyo = origMaxPage
                    Return False
                End If
            End If
        Catch ex As Exception
            valyo = origMaxPage
            Return False
        End Try
    Next
    Return True
End Function

代码的问题,如果maxpage是12,那么用户输入1,3,5,1111

?

输入不能接受负数,如-1或-123

谢谢

我认为在某些时候你无论如何都需要得到页码,所以你应该从那开始:

Public Function ParsePageNumbers(value As String, maxPage As Integer) As List(Of Integer)
        Dim values As New List(Of Integer)()

        For Each strNumber As var In value.Split(","C)
            Dim intValue As Integer
            ' if it wasn't an integer or it's greater than the max page, restore the original value
            If Not Integer.TryParse(strNumber, intValue) OrElse intValue > maxPage Then
                Return Nothing
            End If
            values.Add(intValue)
        Next
        Return values
    End Function

如果页码值无效,该函数将返回Nothing。然后在实际的方法中你可以调用这个方法并检查Nothing:

Private Function isCELLPageNumb(ByRef valyo As String, ByVal origValue As String) As Boolean
    Dim maxPage As Integer = Integer.Parse(origMaxPage)
        ' if it's not parsible, restore the original value
        If ParsePageNumbers(value, maxPage) Is Nothing Then
            value = origMaxPage
            Return False
        End If
        ' it was all valid
        Return True
End Function

结合MackieChan解决方案来解析整数,您应该首先使用Regex

private rgxNumberWithComma As New System.Text.RegularExpressions.Regex("^([0-9]+,?)+$")
Public Function CheckInput(ByVal valyo As String, _
             ByVal origMaxPage As Integer) As Boolean
Dim match = rgxNumberWithComma.Match(valyo)
If Not match.Success Then
    Return False
Else
    Dim numbers as new List(Of Integer) ‘will store added numbers
    For Each Item In valyo.Split(","c)
        Dim intValue As Integer
        ‘Check if number is a valid integer
        ‘Check if number is 0
        ‘Check if number has already added the number list
        ‘Check if number is greater that MaxPage
        If Not Integer.TryParse(Item, intValue) _
                   OrElse intValue > origMaxPage _
                   OrElse intValue = 0 _
                   OrElse numbers.Contains(IntValue) Then
            Return False
        Else
            ‘Item is valid, continue
            Numbers.Add(intValue)    
        End If
    Next
End If
Return True
End Function

参见需要一个Regex逗号分隔的数字列表

在你的Datagridview editingcontrolshowingevent…

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    Try
        If UCase(sCellName) = "PAGENUM" '------> change this with yours
             AddHandler e.Control.KeyPress, AddressOf PageKeypress
        End If
    Catch ex As Exception
        '... 
    End Try
End Sub

Private Sub PageKeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    Static sLast As String = ""
    Dim k As Byte = Asc(e.KeyChar)
    Dim sN As String = "0123456789,"
    Dim sO As String = Chr(8) & Chr(13) & Chr(1) & Chr(3) & Chr(22)
    Dim nMaxPage As Integer = 12 '-------change this with yours
    If Not (sN & sO).Contains(e.KeyChar) Then
        e.Handled = True
    Else
        Select Case e.KeyChar
            Case ","
                If sLast = "," Then
                    e.Handled = True
                Else
                    e.Handled = False
                    sLast = ","
                End If
                Exit Sub
            Case "0"
                If sLast = "," Or sLast = "" Then
                    e.Handled = True
                    Exit Sub
                End If
            Case Chr(13) '-- avoid "," in end of text OR YOU CAN REMOVE THIS
                If sLast = "," Then e.Handled = True
        End Select
        If sLast = "," Then sLast = ""
        If Val(sLast & e.KeyChar) > nMaxPage Then
            e.Handled = True
            Exit Sub
        End If
        sLast &= IIf(sN.Contains(e.KeyChar), e.KeyChar, "")
    End If
End Sub

最新更新