Справочные переменные и объекты в другом месте в форме

Я пытаюсь передать объект оборудования объекту формы, а затем использовать этот объект оборудования в событии клика с помощью кнопки в форме. Но я не знаю, как правильно ссылаться на объект оборудования в событии кнопки.

Я создал новый экземпляр формы, используя:

Public Sub New(ByRef thisEquip As classEquipment) Me.InitializeComponent() Me.Text = thisEquip.equipName & " Tests" End Sub 

и настройте событие нажатия кнопки следующим образом:

 Private Sub btnUpdateAndClose_Click(sender As Object, e As EventArgs) Handles btnUpdateAndClose.Click Call updateTestList(thisEquip) End Sub 

Но объект thisEquip не распознается. Я думаю, это потому, что отправитель – это кнопка, а не сама форма. Однако я не знаю, как ссылаться на объект оборудования из формы.

Область действия зависит от того, где объявлена ​​переменная. Возможно, вы пропустили что-то, снижающее связь – каждое резюме уровня охвата включает в себя фразу, в которой она объявлена .

Теперь посмотрим на ваш конструктор:

 Public Sub New(ByRef thisEquip As classEquipment) 

thisEquip объявляется как аргумент конструктору. Таким образом, он существует только в этой процедуре. Тот факт, что процедура находится в форме или что thisEquip упоминается в форме (или модуле или что-то еще), является случайным. Хотя верно, что конструктор является особым в нескольких отношениях, в вопросах области видимости это просто еще одна процедура.

Область формы

Чтобы сохранить ссылку на нее для использования в другом месте:

 Public Class Form1 ' declare a variable to hold the reference Private myEquip As classEquipment ' declare an array Private myImgs As Image() Public Sub New(ByRef thisEquip As classEquipment) InitializeComponent() ... myEquip = thisEquip ' assign param to the var ' assign array of images to the Form level var ' via a temp array myImgs = New Image() {My.Resources.add, My.Resources.ballblack, My.Resources.ballblue, My.Resources.ballgreen} End Sub 

Объявленный на уровне формы, он имеет область вида / classа. Теперь вы можете ссылаться на myEquip или myImgs в любой форме. Не используйте Dim просто присваивая что-то объекту уровня формы – он создаст новую локальную, но идентичную именованную переменную.


Другие общие уровни охвата:

Область действия процедуры

 Private myFoo as Int32 Private Sub DoSomething() Dim myBar As String myBar = "Ziggy" ... Dim myFoo As Int32 = 7 End Sub 

Это чаще всего называют локальной областью . Я использую уровень процедуры, потому что он лучше сравнивает и контрастирует с другими условиями.

myBar объявляется в методе DoSomething , поэтому он имеет область уровня процедуры – он существует только в этом методе. Попытка использовать его в другом месте приведет к ошибке. Это похоже на приведенный выше пример конструктора, причем основное отличие заключается в том, что thisEquip объект thisEquip был передан как параметр, а не объявлен локально.

Это приводит к некоторому запутыванию: Dim myFoo в методе объявляет (создает!) myFoo переменную myFoo , локально единственную, которая не имеет никакого отношения к переменной уровня Form / Class с тем же именем. Локальная версия скрывает другую. Часть путаницы для этого, похоже, состоит в том, что некоторые считают, что им нужно (re) использовать Dim прежде чем они смогут использовать переменную. Ты не.


Уровень блока

Непосредственно из MSDN:

 If n < 1291 Then Dim cube As Integer cube = n ^ 3 End If 

Справедливое количество операторов VB создает область блока ( For Each / Next , If / End If и Using / End Using ). Переменные, объявленные внутри блока, имеют область действия, ограниченную этим блоком. В принципе, (почти) все, что приводит к отступу, создает область блокировки.

 Private Sub ..... Dim cube As Int32 If n < 1291 Then cube = n ^ 3 End If 

Теперь cube можно использовать в другом месте процедуры: его область была изменена с блока на локальную.

Для получения дополнительной информации см. MSDN:
- Область применения Visual Basic
- Типы значений и типы ссылок

  • «Существует уже открытый DataReader ...» Повторное использование или удаление соединений с БД?
  • Слушайте нажатие клавиши, когда программа находится в фоновом режиме
  • Должен ли я использовать ключевое слово Call в VB / VBA?
  • Выбор того IP-адреса, который используется HTTP-запросом при наличии нескольких IP-адресов (.NET)
  • Эквивалентность «С ... End With» в C #?
  • Проверка Recaptcha 2 (нет CAPTCHA reCAPTCHA) на стороне сервера ASP.NET
  • C # Async - Как это работает?
  • Правильный способ размещения объекта Excel com с помощью VB.NET?
  • Как создать обработчик событий для программно созданного объекта в VB.NET?
  • Эквивалент MoveNext в VB.NET
  • Поставщик Microsoft.ACE.OLEDB.12.0 не зарегистрирован на локальной машине
  • Давайте будем гением компьютера.