lelouch_vi 2 Ответов: 2

Как изменить значение метки и в зависимости от числового элемента управления updown?


Привет, я действительно расстроен из-за этого. Я не могу найти никакого решения по этому поводу. У меня есть метка и числовое обновление в моей форме, и то, что я пытаюсь сделать, это уменьшить значение метки всякий раз, когда числовое обновление нажимается вверх, и увеличить значение метки, когда числовое обновление нажимается вниз.

Метка имеет значение 100, и я хочу уменьшить его всякий раз, когда числовое обновление нажимается вверх, и наоборот.

Что я уже пробовал:

Private Sub numCategory_ValueChanged(sender As Object, e As EventArgs) Handles numCategory.ValueChanged

        Dim oldvalue As Integer


        If numCategory.Value > oldvalue Then

            lblpoints.Text -= 1

        ElseIf numCategory.Value < oldvalue Then


            lblpoints.Text += 1
        Else

            lblpoints.Text = ""

        End If

        oldvalue = numCategory.Value



    End Sub


Я попробовал приведенный выше код, кажется, что он просто делает все в беспорядке.

2 Ответов

Рейтинг:
13

OriginalGriff

Посмотрите на свой код:

Dim oldvalue As Integer
Объявляет oldvalue как локальная переменная, значение которой будет отброшено при возврате метода.

Переместите объявление за пределы метода, и оно начнет работать лучше. (Не идеально, но это ошибка, которую вам нужно будет найти и исправить позже - правильное тестирование покажет ее).


lelouch_vi 2

Ух ты! Большое спасибо. Это работает именно так, как я хотел. Мне интересно, как он ведет себя таким образом? Я поставил oldvalue на уровень класса, и теперь он работает нормально. Пожалуйста, объясните, что только что произошло?

OriginalGriff

It's gets complicated, but I'll try to simplify it as much as I can. There are two type of memory in .NET: the heap, and the stack. Heap is where all the items you create with the New keyword are stored, the stack is much smaller, and holds information that is created and destroyed while your app runs. You call a method, it stores where to Return to on the stack, and allocates space on the stack for each of the variables the method will use (generally to store references to items on the Heap). When the method returns, that information is discarded (though the Heap data persists, the local references to it are discarded), and control is passed back to the place the method was called from.
Это похоже на стопку монет: положите сверху лист бумаги, затем добавьте пять монет: чтобы прочитать, что на бумаге, вы должны сначала удалить монеты. Бумага-это обратный адрес, монеты-локальные переменные.
Таким образом, каждый раз, когда вы вызываете свой метод, локальные переменные создаются заново, и вы понятия не имеете, каким могло быть предыдущее содержимое - они снова начинаются с нуля.
Размещение определения переменной вне любых методов делает ее частью класса, поэтому она больше не является локальной и не уничтожается при выходе метода.

Это большое (вы даже не представляете, насколько большое!) упрощение, но без возможности видеть, когда ваши глаза начинают стекленеть, трудно быть более точным! :смеяться:

lelouch_vi 2

ха-ха!спасибо Вам за попытку подвести итоги половины моего семестра. Извините, что задаю слишком много вопросов, но я просто хочу прояснить ситуацию, чтобы узнать больше.

lelouch_vi 2

будет ли то же самое, если я объявлю oldvalue статическим внутри метода?

lelouch_vi 2

Могу я узнать, что именно происходит с этой линией? lblpoints.Text -= 1 у меня есть текст "100" на этом "lblpoints", и я немного путаюсь с этим выражением
-lblpoints.Text -= 1" потому что это выглядит так, как будто он уменьшает текстовое значение метки, даже если это строка?

OriginalGriff

Это потому, что VB-дерьмовый язык.
Что происходит, так это то, что VB смотрит на ваш код и говорит себе: "Похоже, он пытается вычесть число из чего - то-я преобразую строку в число, вычитаю ее и изменю обратно в строку, когда закончу". И большую часть времени это работает, пока не произойдет что-то еще, и вдруг преобразование не завершится неудачей, и ваше приложение не выйдет из строя без видимой причины. Вот почему ваше предложение Else является ошибкой - если оно когда-либо произойдет, то в следующий раз, когда метод будет выполнен, строка больше не будет числом, и все это пойдет вверх, без каких-либо изменений в вашем коде.

Это называется "слабой типизацией", и это всего лишь одна из причин того, что люди с опытом работы на других языках (почти какой-нибудь другие языки) не нравится VB! :смеяться:
Это означает, что проблемы, которые должны быть обнаружены или, по крайней мере, рассмотрены во время компиляции, не обнаруживаются до времени выполнения, а часто и до тех пор, пока приложение не будет запущено в производство - одна из причин, по которой приложения VB часто считаются менее надежными, чем приложения C# или C++, например.

lelouch_vi 2

Я вижу. Я действительно беспокоюсь об этом. Я думал, что скачал visual studio с ошибкой. Так что я действительно должен преобразовать эту строку в целое число, чтобы избежать "слабой типизации", ха-ха. Таким образом, vb действительно предполагает, что это целое число.
Большое вам спасибо за вашу помощь!

OriginalGriff

Всегда пожалуйста!

OriginalGriff

Или используйте целое число уровня класса и обновите его, а затем преобразуйте в строку для отображения в метке.
Это также имеет преимущество "разделения проблем" между UI (display stuff) и BL (logic of what happens).

lelouch_vi 2

Я попытался поставить "ха-ха" вместо "100" в качестве значения метки, чтобы попробовать что-то, и это дает мне исключение для строки преобразования ошибки в double, что имеет смысл. Означает ли это, что visual studio рассматривает "100" как целое число?

OriginalGriff

Смотреть выше.

lelouch_vi 2

У меня есть еще один вопрос. Я сожалею об этом. Теперь происходит следующее: всякий раз, когда я сохраняю значение числового элемента управления updown в базе данных, метка должна оставаться прежней, но после нажатия кнопки save она увеличивается на 1. Я не знаю, что здесь происходит на самом деле. Допустим, у меня есть значение 50 в моем числовом элементе управления updown, так что моя метка должна быть 50 также после того, как я нажал кнопку save, метка должна быть 50, но это не так, она стала 51.

OriginalGriff

Теперь вам нужно сделать некоторую отладку.
Запустите код в отладчике и поместите точку останова в верхней части метода numCategory_ValueChanged.
Теперь сделайте свое обновление и сохраните, и посмотрите, что произойдет ... вернитесь, когда вы попытаетесь это сделать, и дайте мне знать, что, по вашему мнению, происходит. :)

Я не могу сделать это для вас - у меня есть только код для одного метода в вашем приложении - и вообще нет доступа к вашей БД.

lelouch_vi 2

ха-ха, да, спасибо. Я вернусь сюда, как только сделаю все, что в моих силах. хаха. спасибо за ваше терпение.

Рейтинг:
10

lelouch_vi 2

это, безусловно, мое лучшее решение моей собственной проблемы. Если есть еще улучшения, которые необходимы, пожалуйста, поправьте меня.

Static num As Integer = 100
        Static oldvalue As Integer


        If numCategory.Value > oldvalue Then

            num -= 1

            lblpoints.Text = num.ToString


        ElseIf numCategory.Value < oldvalue Then
            num += 1
                lblpoints.Text = num.ToString


        Else

            lblpoints.Text = ""

        End If

            oldvalue = numCategory.Value


и чтобы очистить значение числового элемента управления updown без того, чтобы метка была сумасшедшей после метода, я просто обнаруживаю это:

numCategory.ResetText()


именно по этой причине моя метка увеличивается на 1 после того, как метод выполнил свою работу, потому что я использовал
numCategory.value = nothing 
чтобы очистить числовой элемент управления, и поэтому он портит мой код.

Спасибо OriginalGriff за помощь и терпение, ха-ха.