Visual Basic - 如何强制事件触发

时间:2010-12-21 14:31:13

标签: vba event-handling

我是VB的新手(实际上是使用VBA),我想强迫事件发生。具体来说,我正在更新文本框中的值,我想调用该文本框的AfterUpdate()事件。

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

在运行期间,出现“编译错误:无效使用属性”的错误。如果我尝试类似的东西,但使用click事件(例如:cmdCreateInvoice.Click),它没有共享名称的属性,我收到一条错误,上面写着“编译错误:找不到方法或数据成员”。 /> 我知道必须有办法从另一个事件中解雇一个事件。但是正确的语法是什么? 谢谢!

5 个答案:

答案 0 :(得分:9)

AFAIK,在VB(A)中有方式“手动触发事件”。你可以做的是手动调用事件处理程序,为此,rdkleine已经给你答案了:

Call txtInvDate_AfterUpdate()

这与事件被触发具有完全相同的效果(尽管它为您提供可能同时触发的整个事件链 - 除非您{{1}他们的处理程序也是如此)。

IgorM还有另一个有效的观点,在对他的答案的评论中 - 编写一个不同的 Sub来完成你想要完成的工作是“更干净”,然后从事件处理程序&无论你现在想做什么(按钮点击?)。所以:

Call

您甚至可以在模块中将Private Sub txtInvDate_AfterUpdate() DoWhatever End Sub Private Sub button_Click() DoWhatever End Sub Private Sub DoWhatever 'your desired effect End Sub 设为公共子。

修改

不,在VB(A)中,定义Sub(或Function)例程的顺序无关紧要。

答案 1 :(得分:3)

致电

  

txtInvDate_AfterUpdate()

答案 2 :(得分:0)

尝试使用以下内容:

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

尝试使用Change事件。

答案 3 :(得分:0)

有些代码显然会(遗憾地)强迫事件发生:

    Me.Dirty = False
根据我的理解,

强制使用BeforeUpdate和AfterUpdate。可能还有更多的案例。以这种方式附加到您的代码的任何秘密钩子反映了我认为的糟糕设计,并且将不可避免地导致无意中的&令人沮丧的循环被创造。

答案 4 :(得分:0)

有没有一种方法可以保持文本框事件触发,直到我单击另一个文本框?我需要在“ Do While循环”文本框内进行选择。做出选择后,我希望用户能够替换选择而不必再次单击文本框。如果用户对选择感到满意,则可以单击其他文本框。