Выберите Case, видя только одну цифру - PullRequest
0 голосов
/ 23 мая 2018

enter image description here

Изображение проблемы.Вместо просмотра значения TextBox, равного 20, возвращается 2, которое является первой цифрой двухзначного числа в текстовом поле

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

Выберите регистр, глядя только на 1 цифру.

У меня работает функция регистрачерез некоторые числа и должен изменить текстовый цвет, если значение больше 4, больше 3 или больше 2 или больше 1

Работает нормально для чисел до 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 голосов
/ 24 мая 2018

Вы сравниваете строку (свойство .Text) с числом.Прежде чем VB выполнит сравнение, он должен привести значения к общему основанию.

Как именно это выполняется, в первую очередь зависит от контекста, поэтому в первую очередь рекомендуется избегать свободно вводимых сравнений.

  • Если вы сравниваете строковую переменную с числовым содержимым с числом:

    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.Text, который является String, но работал с TextStatas.Tag, который является Object.


Вы не должны полагаться на эти правила, всегда используйте Option Strict On и измените код на

Select Case Integer.Parse(TextStatas.Text)
    ...
End Select
0 голосов
/ 24 мая 2018

Вы должны привести 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...