Рейтинг:
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 за помощь и терпение, ха-ха.