选择Case仅查看一位数

时间:2018-05-23 20:48:10

标签: vb.net winforms visual-studio

enter image description here

问题图片。而不是查看TextBox的值20是返回2,这是文本框中2位数字的第一个数字

------------------ // --------------------

选择仅查看1位数的案例。

我有一个案例函数运行一些数字,如果值超过4,或超过3或超过2或超过1,它应该更改textcolour

它适用于最多9的数字,但是当数字开始有多个数字时,它只会查看第一个数字。代码如下:

For Each TextStatas In Arr_TextStat

        Select Case TextStatas.Text
            Case > 4
                TextStatas.BackColor = Color.Green

            Case > 3
                TextStatas.BackColor = Color.GreenYellow

            Case > 2
                TextStatas.BackColor = Color.Gold

            Case > 1
                TextStatas.BackColor = Color.DarkOrange

            Case > 0
                TextStatas.BackColor = Color.Red

            Case 0
                TextStatas.BackColor = Color.Red

        End Select
    Next

我在不同的表单上使用了类似的代码,连接到同一个数据库并查看与此表单相同的表和列,但在那里它工作正常。

无法理解错误!

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:2)

您应该使用TextStatas

CInt(TextStatas)转换为整数
<TestMethod()> Public Sub TestMethod1()

    Dim Arr_TextStat(5) As String
    Arr_TextStat(0) = "1"
    Arr_TextStat(1) = "2"
    Arr_TextStat(2) = "3"
    Arr_TextStat(3) = "4"
    Arr_TextStat(4) = "9"
    Arr_TextStat(5) = "20"

    Dim backColor As Color = Color.AntiqueWhite

    For Each TextStatas In Arr_TextStat
        Select Case CInt(TextStatas)
            Case > 4
                backColor = Color.Green

            Case > 3
                backColor = Color.GreenYellow

            Case > 2
                backColor = Color.Gold

            Case > 1
                backColor = Color.DarkOrange

            Case > 0
                backColor = Color.Red

            Case 0
                backColor = Color.Red

        End Select

        Debug.WriteLine("{0} - {1}", TextStatas, backColor)
    Next
End Sub

给出了这些结果:

Debug Trace:
1 - Color [Red]
2 - Color [DarkOrange]
3 - Color [Gold]
4 - Color [GreenYellow]
9 - Color [Green]
20 - Color [Green]

答案 1 :(得分:0)

您正在将字符串(.Text属性)与数字进行比较。在进行比较之前,必须将这些值放在一个共同点上。

具体如何执行取决于上下文,这就是为什么建议首先避免松散类型的比较。

  • 如果要将字符串变量与类似数字的内容与数字进行比较:

    Dim s As String = "26"
    
    MsgBox(s > 2)
    MsgBox(s > 3)
    

    VB会将类似数字的字符串转换为数字,然后执行比较。在这两种情况下,结果都是True

    如果s包含无法转换为数字的内容,则会出现运行时错误。

  • 如果使用字符串变量作为Select Case子句的源,则会发生相反的情况,并且各个Case子句中的值首先转换为字符串,然后无论所讨论的变量是否包含类似数字的字符串,都会执行比较:

    Dim s As String = "26"
    
    Select Case s
        Case Is > 3
            MsgBox("> 3")
        Case Is > 2
            MsgBox("> 2, but < 3")
        Case Else
            MsgBox("Other")
    End Select
    

    您会看到"> 2, but < 3",因为"26" > "2",但是"26" < "3"

    如果s包含无法转换为数字的内容(例如,使用s = "sdf"),它的工作原理会相同。

  • 如果您要将Object变量与数字进行比较,则无论是直接使用还是作为Select Case的来源,它都会首先转换为数字:

    Dim s As Object = "26"
    
    MsgBox(s > 2)  ' True
    MsgBox(s > 3)  ' True
    
    Select Case s
        Case Is > 3
            MsgBox("> 3")  ' Displays
        Case Is > 2
            MsgBox("> 2, but < 3")
        Case Else
            MsgBox("Other")
    End Select
    

    如果s包含无法转换为数字的内容,则在这两种情况下都会出现运行时错误。

这就是为什么它不适用TextStatas.TextString,但与TextStatas.Tag合作,Object

您不应该依赖这些规则,始终使用Option Strict On,并将代码更改为

Select Case Integer.Parse(TextStatas.Text)
    ...
End Select