我正在使用Visual Studio 2010上的VISUAL BASIC在我的一个班级中为一个高尔夫程序编写代码,并且试图创建一个循环,在该循环中我输入信息,如果该信息不是数字的,则不在一定的数字范围内,而不是空白字符,它将返回一个错误消息框,允许我修复程序,但是当前,如果我输入了错误的信息,它将仅显示消息框,告诉我我错了,而是继续进行下一步让我重新输入我的信息。

这是代码:

Do
    sScore = InputBox("Enter Score", "Score Entry ")
    If (IsNumeric(sScore) = True) Then
        If (Not IsNumeric(sScore)) Then
            MessageBox.Show("Score Must Be Numeric", "Validate Score", MessageBoxButtons.OK)
            CheckValue = "N"
        End If
        If (Val(sScore) <= 59) Then
            MessageBox.Show("Score Must Be Greater Than 0", "Validate Score", MessageBoxButtons.OK)
            CheckValue = "N"
        End If
        If (sScore = "") Then
            MessageBox.Show("Are You Sure You Want To Exit?", "Data Information", MessageBoxButtons.OKCancel)
            If DialogResult.OK Then
                Exit Sub
            ElseIf DialogResult.Cancel Then
                CheckValue = "N"
            End If
        End If
    End If
    CheckValue = "y"
Loop While CheckValue = "N"

===============>>#1 票数:0

为了使您的功能正常运行,需要进行许多更正。 在以下代码中对它们进行了注释:

    Try
        Dim inpScore As String = "" ' need to use a string for the return value of the InputBox
        Dim sScore As Integer
        Dim CheckValue As String = "N"

        Do
            ' if non-numeric character or Empty String is inputted 
            ' an exception will be raised
            inpScore = InputBox("Enter Score", "Score Entry ")
            ' Need to test empty string before numeric test
            If (CStr(inpScore) = "") Then
                MessageBox.Show("Are You Sure You Want To Exit?", "Data Information", MessageBoxButtons.OKCancel)
                If DialogResult.OK Then
                    Exit Sub
                ElseIf DialogResult.Cancel Then
                    CheckValue = "N"
                End If
            End If
            'you do  not need to test for true since function returns a boolean
            If (IsNumeric(inpScore)) Then 
                'Move test and error message to Else statement added below  
                'If (Not IsNumeric(sScore)) Then
                '    MessageBox.Show("Score Must Be Numeric", "Validate Score", MessageBoxButtons.OK)
                '    CheckValue = "N"
                'End If
                sScore = CInt(inpScore)  ' set sScore to inputted value
                If (sScore <= 59) Then ' REMOVE Val( - we know it is numeric
                    MessageBox.Show("Score Must Be Greater Than 0", "Validate Score", MessageBoxButtons.OK)
                    CheckValue = "N"
                Else
                    CheckValue = "Y"
                End If
            Else
                MessageBox.Show("Score Must Be Numeric", "Validate Score", MessageBoxButtons.OK)
                CheckValue = "N"
            End If

            'CheckValue = "y" ' remove so that lopp continues
        Loop While CheckValue = "N"
    Catch ex As Exception
        MessageBox.Show(ex.Message)

    End Try
End Sub

===============>>#2 票数:0

只需将您的messagebox.show()替换为Throw New Exception("...") ,然后用错误处理程序包装DO循环。

这将使您跳出循环并仍然显示您的消息。

===============>>#3 票数:0

它不起作用的原因应该对您显而易见:

    Do
        ' ...
        ' ...

        CheckValue = "y" ' <- HERE !
    Loop While CheckValue = "N" ' <- CheckValue is changed to "y" the line before :/ 

我认为您不希望用户在输入有效输入或取消并退出InputBox

而且您想知道验证或取消的结果...

因此, 步骤1是创建一个枚举。

Option Strict On
Option Explicit On
Option Infer Off

Public Enum UserScoreValidation
    ' Add three first states :
    Validated
    Erroneous
    Cancelled
End Enum

第2步是使用Do / Loop声明逻辑:

Public Sub UserInputsScore()
    ' Always declare the type, avoid infering...
    Dim sScore As String ' user input
    Dim enumValidation As UserScoreValidation = UserScoreValidation.Erroneous ' result

    ' Then create the loop...
    Do
        ' ...
        ' ToDo : Placeholder - Remove the following...
        enumValidation = UserScoreValidation.Cancelled
        ' ...
    Loop While enumValidation = UserScoreValidation.Erroneous
End Sub

第三步是编写循环逻辑,处理用户取消:

    Do
        sScore = InputBox("Enter Score", "Score Entry ").Trim()
        ' add Trim() to avoid inputs like "  752", but see Trim() note below...

        ' Check results...
        If sScore <> "" Then
            If IsNumeric(sScore) Then
                ' ToDo : Placeholder - Remove the following...
                enumValidation = UserScoreValidation.Cancelled
                ' ...
            Else
                ' Well : non numeric value entered...
                MessageBox.Show("Score Must Be Numeric", "Validate Score")
                ' You don't need the MessageBoxButtons.OK, it's there by default
                enumValidation = UserScoreValidation.Erroneous ' Try again...
            End If
        Else
            ' Either the user entered nothing, either entered spaces, either cancelled..
            ' That's why I don't like InputBox,
            ' You can't know for sure wether user cancelled or entered Whitespaces.
            ' => Assuming the user cancelled
            emumValidation = UserScoreValidation.Cancelled
        End If
    Loop While enumValidation = UserScoreValidation.Erroneous

步骤4是检查输入的数值:

            If IsNumeric(sScore) Then
                ' I Don't know if you're working with Integers or Floating numbers.
                ' So I assume Integers by default !
                ' Declare an Integer :
                Dim intScore As Integer = -1 ' just to make sure

                ' However, you'll have to move that intScore variable 
                ' at the top of the Method later... (Remember this)

                If Integer.TryParse(sScore, intScore) Then
                    If intScore > 0 Then
                        If intScore <= 59 Then
                            ' CONGRATULATIONS !!!
                            enumValidation = UserScoreValidation.Validated
                        Else
                            MessageBox.Show("Score Must Be equal or below 59", "Validate Score")
                            ' Try again...
                            enumValidation = UserScoreValidation.Erroneous
                        End If
                    Else
                        MessageBox.Show("Score Must Be Greater Than 0", "Validate Score")
                        ' Try again...
                        enumValidation = UserScoreValidation.Erroneous
                    End If
                Else
                    ' Wasn't a valid Integer input ! :(
                    ' However, what about "48.15" or "23." ?
                    ' ^^ that's why I asked, but from now on, 
                    ' those are assumed incorrect entries.
                    MessageBox.Show("Score Must Be entered as Integer", "Validate Score")
                    enumValidation = UserScoreValidation.Erroneous
                End If
            Else
                ' ....

步骤5对话框确认用户取消:

    Do
        ' ...
        ' ...

        If sScore <> "" Then
            ' ...
            ' ...
        Else
            If MessageBox.Show("Do you want to Cancel Score Input ?", "Data Information", MessageBoxButtons.OKCancel) _
                = DialogResult.OK Then
                ' Bye bye !
                emumValidation = UserScoreValidation.Cancelled
            Else
                ' Try again...
                emumValidation = UserScoreValidation.Erroneous
            End If
        End If
    Loop While enumValidation = UserScoreValidation.Erroneous

插曲:

如您所见,有很多enumValidation = UserScoreValidation.Erroneous ...
通过这种方式可以一眼看出逻辑。

但是,请注意,在声明中,我已经将enumValidation值设置为UserScoreValidation.Erroneous 因此,我们在步骤6中修复了该问题:

步骤6

  • 默认enumValidationUserScoreValidation.Erroneous里面
  • 并删除所有冗余分配(如果可能,还包括If / Else块)。
  • 使用enumValidationintScore在Do / While循环之后处理验证

这是整个方法

Public Sub UserInputsScore()
    Dim sScore As String ' user input
    Dim enumValidation As UserScoreValidation = UserScoreValidation.Erroneous
    Dim intScore As Integer = -1
    ' Note : I've moved intScore declaration here !

    Do
        enumValidation = UserScoreValidation.Erroneous ' Try again by default..
        sScore = InputBox("Enter Score", "Score Entry ").Trim()

        If sScore <> "" Then
            If IsNumeric(sScore) Then
                ' Note : intScore declaration removed !

                If Integer.TryParse(sScore, intScore) Then
                    If intScore > 0 Then
                        If intScore <= 59 Then
                            enumValidation = UserScoreValidation.Validated
                        Else
                            MessageBox.Show("Score Must Be equal or below 59", "Validate Score")
                        End If
                    Else
                        MessageBox.Show("Score Must Be Greater Than 0", "Validate Score")
                    End If
                Else
                    MessageBox.Show("Score Must Be entered as Integer", "Validate Score")
                End If
            Else
                MessageBox.Show("Score Must Be Numeric", "Validate Score")
            End If
        Else
            If MessageBox.Show("Do you want to Cancel Score Input ?", "Data Information", MessageBoxButtons.OKCancel) _
                = DialogResult.OK Then
                emumValidation = UserScoreValidation.Cancelled
            End If
        End If
    Loop While enumValidation = UserScoreValidation.Erroneous

    ' Now you can resume on using Score Input or User Cancellation :
    If enumValidation = UserScoreValidation.Validated Then
        ' At this point, enumValidation is either "Validated" or "Cancelled"
        ' intScore Value is 0 < intScore <= 59 because of validation above.

        ' so build the next part of your code inside this If block
        ' and using intScore as required.

        ' unless you have something specific to do upon user cancelation,
        ' don't write any Else block and let the code run til the end.
        ' or if you like that much, un-comment the following
    ' Else
        ' Exit Sub
    End If
End Sub

为什么使用Enum?

  • 枚举可以保持不同的状态
  • 不言自明
  • 枚举状态易于更改,替换,删除,扩展...
  • 枚举可以在Select Case语句中轻松使用

因此,如果需要,您可以例如添加这些值:

  • UserScoreValidation.Bad
  • UserScoreValidation.Average
  • UserScoreValidation.Good
  • UserScoreValidation.VeryGood

以及错误和已取消,然后使用Select Case处理不同的状态:

Select Case enumValidation
    Case UserScoreValidation.Cancelled:
        Exit Sub
    Case UserScoreValidation.Bad:
        MessageBox.Show("Only " + intScore.ToString() "? :O You're terrible :P ")
    ' ...

关于Trim()的注意

dotNet Framework 3.5 SP1 and below删除所有常见的空格, 包括零宽度(U + 200B)和零宽度无间断空格(U + FEFF)。 但是,从dotNet Framework 4.0不再删除上面的两个空白示例,而是删除了三个字符MONGOLIAN VOWEL SEPARATOR(U + 180E),NARROW NO-BREAK SPACE(U + 202F)和MEDIUM MATHEMATICAL SPACE(U + 205F) )由Trim()添加和处理。

MSDN .. (对不起,它是法语的,因为MS会自动检查语言,但是MS会在请求页面时为您找到您的语言)


InputBoxes取消清空输入 ...

如果有人知道dotNet内置类可以提供更好的InputBox,请告诉我。

我来创建自己的InputForm类,该类与默认类相同,但是具有两个属性:

  • InputForm.Value As String'使用Private p_Value as String =“”
  • InputForm.Cancelled As Boolean'使用Private p_Cancelled as Boolean = False

我什至还添加了两个其他属性:

  • InputForm.DefaultValue As String'ReadOnly,在设置Value时设置
  • InputForm.UserAlteredValue As Boolean'ReadOnly-如果InputTextBox.Text <> DefaultValue,则为True。

如果框架具有具有此类属性的对话框,请在下面评论以通知我。 每次必须将此类添加到解决方案中时,我都很懒惰以至于生气:P

  ask by chillyring translate from so

未解决问题?本站智能推荐:

1回复

使用if语句错误检查dr的值

我的数据库(访问)中有一个字段,其中包含我需要在显示时更改的值。 例如,如果从数据库接收到的初始值为“ D”,那么我需要将其更改为“已销毁”。 我曾尝试使用各种if语句,但由于缺乏编程知识而无法前进。 Option Strict不允许=并建议Is。 我想也许我应该看的是一个switc
2回复

表单上错误检查控件的最佳实践

因此,我有一个带有各种不同控件(组合框,文本框,列表框等)的表单。 我的第一个想法是创建一个If,Else,End If语句。 好吧,尽管这行得通,但它也可能变得很长,具体取决于控件和组合的数量。 验证可能包括与WinForms有关的列表框是否已填充,复选框是否已选中等。 有
1回复

Excel范围使用问题(单元错误检查)

我对每个单元格都有以下错误:“此单元格中的数字被格式化为文本或前面有撇号”要复制错误:我必须将来自Web服务的结果存储为字符串数组:示例:(3由3阵列) $ 402,568.03 26.2%30,052 $ 107,719.59 7.0%55,176 $ 81,370.35 5
1回复

如何在Visual Basic中检查单个组件。 错误检查

在文本框中,我只希望0和1的3个数字组合为011,110,111,001,等等。如何编写检查单个组件(从三个数字中)为0或1的值,并指定此值以检查错误? 如果可能,我希望有一个if语句。 例如,如果数字为015,则将显示此消息。 MsgBox(“请在文本框中插入0,1的组合。”)
2回复

在Linq中是否有“Include”版本的编译时错误检查?

在Linq中是否有“Include”版本的编译时错误检查? 我有这个代码 是否有这个“Include”方法的版本,启用了编译时错误检查,因为我有很多关系,有时我需要更改它们的名称,所以如果有一个版本的编译时错误检查将真的有用。 如果有“包含”方法的重载,编译时错误检查,请有人
1回复

如何在Visual Basics中隔离小数点后的数字以进行错误检查

我正在制作一个带有输入数字为(.5)的文本框的程序。 如果用户输入0.0,0.5,1.0,1.5等,则可以。 但如果他/她应该输入2.4,3.6等,我必须产生错误信息。 我应该在与小数点后面的数字相关的If语句中加入什么。 我真的很感激帮助。 谢谢!
1回复

VB.NET需要使用MessageBox进行错误检查的指南

可以说我有一个包含100个文本框,组合框和其他控件的表单,我想检查是否有任何控件为空。 当我单击“确定”按钮时,我希望消息框显示错误列表,例如Textbox1为空,Textbox30为空等。 我可以通过执行繁琐的方法来实现此目的,在该方法中,我检查了textbox1和messagebox
1回复

VB.Net错误检查列表中的字典是否包含字符串

我正在创建一个应用程序,在其中将不同的库,书籍和非书籍媒体存储在字典中,并显示在列表框中。 用户可以为这些元素中的任何一个添加和删除其他字典。 我有一个“当前库中的书籍”和“当前库中的非书籍媒体”的列表框,它们将显示链接到该列表框中突出显示的特定库的媒体。 用户可以自由地在库中添加和删
1回复

错误检索密钥以解密文件vb.net

净我试图修改一些代码..我的目标是用密钥加密文件并存储要解密的密钥,这里是加密的代码 和解密器 加密会继续进行,但是在解密文件时会引发错误,例如“指定的密钥对于该算法而言不是有效大小” 那么如何使密钥有效呢?
2回复

ASP.Net成员身份错误CREATE DATABASE失败。 列出的某些文件名无法创建。 检查相关错误

我正在尝试将AP.Net成员资格添加到我的数据库中。 过去我在此方面取得了成功,因此我对自己的工作有所了解。 我的项目是一个带有Framework 4.5.2的VB.Net网站。 我在框架4中使用asp_regsql.exe将架构添加到我的数据库中。 我创建了以下web.config条目