Visual Basic - как заставить событие срабатывать - PullRequest
1 голос
/ 21 декабря 2010

Я новичок в VB (на самом деле использую VBA) и хотел бы вызвать событие. В частности, я обновляю значение в текстовом поле, и я хотел бы вызвать событие AfterUpdate () этого текстового поля.

Private Sub cmdCreateInvoice_Click()
  Me.txtInvDate = '11/01/10'
  Me.txtInvDate.AfterUpdate
End Sub

Во время выполнения я получаю сообщение об ошибке «Ошибка компиляции: недопустимое использование свойства». Если я пытаюсь сделать что-то подобное, но с событием click (например, cmdCreateInvoice.Click), которое НЕ имеет свойства, разделяющего имя, я получаю сообщение об ошибке «Ошибка компиляции: метод или элемент данных не найден».
Я знаю, что должен быть способ запустить одно событие из другого. Но каков правильный синтаксис? Спасибо!

Ответы [ 4 ]

9 голосов
/ 21 декабря 2010

AFAIK, есть нет способа «запустить событие вручную» в VB (A). То, что вы можете сделать, это вызвать обработчик событий вручную, и для этого rdkleine уже дал вам ответ:

Call txtInvDate_AfterUpdate()

Это будет иметь точно такой же эффект, как если бы событие сработало (хотя оно не даст вам всю цепочку событий, которые могут также сработать вместе с ним - если вы не Call их обработчики а также).

У Игоря есть еще одно правильное замечание в комментариях к его ответу - «чище» написать другой Sub, чтобы выполнить работу, которую вы хотите сделать, а затем вызвать ее как из обработчика событий, так и из любого места, где вы пытаемся сделать это сейчас (нажатие кнопки?). Итак:

Private Sub txtInvDate_AfterUpdate()
    DoWhatever
End Sub

Private Sub button_Click()
    DoWhatever
End Sub

Private Sub DoWhatever
    'your desired effect
End Sub

Вы даже можете сделать DoWhatever Публичной Субпрограммой в Модуле.

Редактировать

И нет, в VB (A) не имеет значения, в каком порядке вы определяете свои подпрограммы (или функции).

3 голосов
/ 21 декабря 2010

Звоните

txtInvDate_AfterUpdate ()

0 голосов
/ 12 августа 2013

Какой-то код, очевидно, (с сожалением) заставит события запускаться:

    Me.Dirty = False

заставляет BeforeUpdate и AfterUpdate срабатывать, насколько я понимаю. Вероятно, есть и другие случаи. Любые секретные хуки, которые таким образом прикрепляются к вашему коду, отражают плохой дизайн, на мой взгляд, и неизбежно приводят к созданию необратимых и разочаровывающих циклов.

0 голосов
/ 21 декабря 2010

Попробуйте использовать что-то вроде этого:

Private Sub TextBox1_LostFocus()
  TextBox1.Value = "5"
End Sub

Используйте событие LostFocus, если вы измените значение вручную.

Или вы можете использовать другой способ:

Private Sub CommandButton1_Click()
   TextBox1.Value = "new value"
End Sub

Private Sub TextBox1_Change()
   MsgBox TextBox1.Value
End Sub

Попробуйте использовать событие Изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...