Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有输入验证的Vb.Net消息框_Vb.net_User Interface_Messagebox_Logic Error - Fatal编程技术网

带有输入验证的Vb.Net消息框

带有输入验证的Vb.Net消息框,vb.net,user-interface,messagebox,logic-error,Vb.net,User Interface,Messagebox,Logic Error,所以我买了一台新的笔记本电脑,帮我决定我想出了一个计分系统。我制作了一个应用程序来帮助计算,它由一系列复选框组成,这些复选框针对不同类别的组件等(CPU、RAM等)具有不同的选项。根据他们的表现给他们打分。 我有几行代码检查每个类别是否选择了多个组件。 如果超过1,则会弹出一个消息框,告诉用户然后重置选项。 但是,消息框在第一次启动后会出现两次 错误视频: 这是我的第一个vb.net solo GUI程序,所以请耐心等待 非常感谢,, :) 末级尝试更换 Public Sub SSD512_C

所以我买了一台新的笔记本电脑,帮我决定我想出了一个计分系统。我制作了一个应用程序来帮助计算,它由一系列复选框组成,这些复选框针对不同类别的组件等(CPU、RAM等)具有不同的选项。根据他们的表现给他们打分。 我有几行代码检查每个类别是否选择了多个组件。 如果超过1,则会弹出一个消息框,告诉用户然后重置选项。 但是,消息框在第一次启动后会出现两次

错误视频:

这是我的第一个vb.net solo GUI程序,所以请耐心等待

非常感谢,, :)

末级

尝试更换

Public Sub SSD512_CheckedChanged(sender As Object, e As EventArgs) Handles SSD512.CheckedChanged
    IS_SSD512 = True
End Sub


我认为问题是,当表单加载时,它会调用取消复选框,这样您的变量就会变为真。

如果使用适当的控件,您可以节省大量代码<代码>单选按钮s仅允许在容器中进行单个选择。容器可以是组框或表单

使用
NumericUpDown
将确保您获得端口区域的数字。用户可以在
文本框中放入任何内容

我在按钮代码中多次使用了
GetSelectedRadioButton
。此函数获取包含单选按钮的容器并返回所选单选按钮。它通过一点Linq魔术来实现这一点,它检查容器中的每个单选按钮,直到找到一个
.Checked=True
。此单选按钮被分配到
rb
,并返回到调用代码。如果未找到选中的单选按钮,则返回
Nothing

如果我们试图检查单选按钮的
.Name
属性,当它为
Nothing
时,我们会得到可怕的NRE(空引用异常),因此,我们要做的第一件事是检查返回的单选按钮
是否为Nothing
。如果用户选择失败,我们将显示一个消息框并退出sub

如果用户进行了选择,我们将使用
Select Case
If
语句来增加
Total

当涉及到端口时,我们通过控件循环获取
属性(一个
十进制
)。若要将其添加到总计中,必须首先将其转换为
整数

最后显示总数

Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
    Dim Total As Integer
    Dim rb = GetSelectedRadioButton(gbProcessor)
    If rb Is Nothing Then
        MessageBox.Show("Please select a Processor.")
        Exit Sub
    Else
        Select Case GetSelectedRadioButton(gbProcessor).Name
            Case "rb545"
                Total += 3
            Case "rb535"
                Total += 2
            Case "rb343"
                Total += 1
        End Select
    End If
    Dim rb1 = GetSelectedRadioButton(gbMemory)
    If rb1 Is Nothing Then
        MessageBox.Show("Please select Memory")
        Exit Sub
    Else
        If rb1.Name = "rb4" Then
            Total += 1
        Else
            Total += 2
        End If
    End If
    Dim rb2 = GetSelectedRadioButton(gbScreenSize)
    If rb2 Is Nothing Then
        MessageBox.Show("Please select a Screen Size.")
        Exit Sub
    Else
        If rb2.Name = "rb14" Then
            Total += 1
        Else
            Total += 2
        End If
    End If
    Dim rb3 = GetSelectedRadioButton(gbStorage)
    If rb3 Is Nothing Then
        MessageBox.Show("Please select Storage size.")
        Exit Sub
    Else
        Select Case rb3.Name
            Case "rb128"
                Total += 1
            Case "rb256"
                Total += 2
            Case "rb512"
                Total += 3
        End Select
    End If
    For Each ctrl As NumericUpDown In gbPorts.Controls.OfType(Of NumericUpDown)
        Total += CInt(ctrl.Value)
    Next
    lblCalculate.Text = Total.ToString
End Sub

Private Function GetSelectedRadioButton(Container As Control) As RadioButton
    Dim rb = Container.Controls.OfType(Of RadioButton)().FirstOrDefault(Function(r) r.Checked = True)
    Return rb
End Function

请将代码和数据添加为文本(使用代码格式),而不是图像(或视频)。图片:A)不允许我们复制和粘贴代码/错误/数据进行测试;B) 不允许基于代码/错误/数据内容进行搜索;C) 视力受损的用户很难清晰阅读,原因还有很多。如果图像添加了一些重要信息,而这些信息并不仅仅是通过文本代码/错误/数据传达出来,那么除了代码格式的文本之外,还应该使用图像。@Steve,这太冗长了。你能解释一下你想要什么吗?是否要添加代码副本?最简单的解决方案是只使用无线组而不是复选框。请为此项目和所有vb.net项目启用“严格”选项。您正在尝试将.Text属性(字符串)分配给整数变量。另外,Text是一个属性而不是一个方法。后跟。带括号的文本表示正在调用方法。
Public Sub SSD512_CheckedChanged(sender As Object, e As EventArgs) Handles SSD512.CheckedChanged
    IS_SSD512 = SSD512.Checked
End Sub
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
    Dim Total As Integer
    Dim rb = GetSelectedRadioButton(gbProcessor)
    If rb Is Nothing Then
        MessageBox.Show("Please select a Processor.")
        Exit Sub
    Else
        Select Case GetSelectedRadioButton(gbProcessor).Name
            Case "rb545"
                Total += 3
            Case "rb535"
                Total += 2
            Case "rb343"
                Total += 1
        End Select
    End If
    Dim rb1 = GetSelectedRadioButton(gbMemory)
    If rb1 Is Nothing Then
        MessageBox.Show("Please select Memory")
        Exit Sub
    Else
        If rb1.Name = "rb4" Then
            Total += 1
        Else
            Total += 2
        End If
    End If
    Dim rb2 = GetSelectedRadioButton(gbScreenSize)
    If rb2 Is Nothing Then
        MessageBox.Show("Please select a Screen Size.")
        Exit Sub
    Else
        If rb2.Name = "rb14" Then
            Total += 1
        Else
            Total += 2
        End If
    End If
    Dim rb3 = GetSelectedRadioButton(gbStorage)
    If rb3 Is Nothing Then
        MessageBox.Show("Please select Storage size.")
        Exit Sub
    Else
        Select Case rb3.Name
            Case "rb128"
                Total += 1
            Case "rb256"
                Total += 2
            Case "rb512"
                Total += 3
        End Select
    End If
    For Each ctrl As NumericUpDown In gbPorts.Controls.OfType(Of NumericUpDown)
        Total += CInt(ctrl.Value)
    Next
    lblCalculate.Text = Total.ToString
End Sub

Private Function GetSelectedRadioButton(Container As Control) As RadioButton
    Dim rb = Container.Controls.OfType(Of RadioButton)().FirstOrDefault(Function(r) r.Checked = True)
    Return rb
End Function