需要帮助调用事件处理程序括号之外的变量

时间:2013-10-17 15:58:35

标签: vb.net

我有这个代码

Private Sub moAccounts_PositionUpdate(ByVal poPositions As A4.API.AccountList.PositionUpdateList) Handles moAccounts.PositionUpdate

    ' Display the position details.
    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In poPositions

       'code here

    Next

    End sub

我想要做的是从另一个sub中调用上面的sub。问题是变量poPositions在代码中没有出现。我认为这是由API提供的一系列数据。我需要找出如何从事件处理程序括号中的服务器API获取数据,以便我可以调用上面的子并更新数据

我试过这个:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    udate()

End Sub

Private Sub udate()

    Dim poPositions As A4.API.AccountList.PositionUpdateList

    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In poPositions

       'code here
    Next

End Sub

代码编译,但是当我运行代码时代码停止执行并显示错误下划线poPositions

    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In **poPositions**

*Object reference not set to an instance of an object.*

如果ByVal poPositions由于A4.API.AccountList.PositionUpdateList在事件处理程序括号内工作,它必须在外部工作。问题是(我猜)在语法

这显然不起作用

Dim poPositions As A4.API.AccountList.PositionUpdateList

我在外面试了括号:

ByVal poPositions As A4.API.AccountList.PositionUpdateList

但是在ByVal上会产生错误

所以我被困在如何...定义(?)... poPositions。当声明被放置在外部事件处理程序括号中时,poPositons面前的术语是什么来让它获取数据?

2 个答案:

答案 0 :(得分:1)

这一行是你的问题:

Dim poPositions As A4.API.AccountList.PositionUpdateList

您声明变量,但您从未设置它。

答案 1 :(得分:0)

您要做的并不像移动代码那么简单。当触发moAccounts_PositionUpdate事件时,服务器将数据需要传递给处理程序并提供它。如果您没有此信息,则必须从头开始创建或重新使用服务器在之前调用moAccounts_PositionUpdate时提供的信息的副本(除非服务器为您提供了一种方法请求按需提供该信息的副本)。您可以做的一件事是存储服务器提供的最后一个poPositionsValue的副本。但是,只有在任何人点击按钮之前发生了 moAccounts_PositionUpdate时,这才有效。如果moAccounts_PositionUpdate事件从未运行,则您将无法获得任何数据,该按钮将再次出现错误。

Private cachedPoPositions As A4.API.AccountList.PositionUpdateList
Private Sub moAccounts_PositionUpdate(ByVal poPositions As A4.API.AccountList.PositionUpdateList) Handles moAccounts.PositionUpdate
    ' Save for re-use later
    cachedPoPositions = poPositions
    ' Display the position details.
    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In poPositions
       'code here
    Next
End sub

Private Sub udate()
    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In cachedPoPositions
       'code here
    Next
End Sub

如果你能找到一些能够在需要时请求来自API的当前信息的功能,那会更好。例如:

Private Sub udate()
    Dim poPositions = moAccounts.GetPositionUpdateList()
    For Each oUpdate As AccountList.PositionUpdateList.PositionUpdate In poPositions
       'code here
    Next
End Sub