1

我在 DataGridView 中编码,并验证单元格是否仅具有数字和逗号格式,该单元格用于文档页面,返回 true 或接受的示例格式:1,2 或 1,2,5 但不是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

谢谢

4

3 回答 3

2

我假设在某些时候你无论如何都需要获取页码,所以你应该从这个开始:

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
于 2013-06-09T19:32:28.407 回答
1

在您的 Datagridview EditingControlShowing 事件中尝试...

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
于 2013-06-10T03:51:32.150 回答
1

结合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

请参阅需要正则表达式以获取逗号分隔的数字列表

于 2013-06-09T21:39:25.327 回答