从其他表单调用sub会产生不同的结果

时间:2016-07-12 04:24:45

标签: vb.net forms sockets nullreferenceexception public

我遇到了VB.NET的问题:

我有3种不同的表格(公共类):mainForm,plotForm和tradeForm。

plotForm和tradeForm都调用了一个sub,它是mainForm的一部分,名为SendHost:

Public Class mainForm
    Public Sub SendHost(Text As String)
        Dim OutData() As Byte = Encoding.Unicode.GetBytes(Text)
        Client.BeginSend(OutData, 0, OutData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnSend), Client)
    End Sub
End Class

从plotForm打电话时,根本没问题:

Public Class plotForm
    Private Sub btnBuy_Click(sender As Object, e As EventArgs) Handles btnBuy.Click
        mainForm.SendHost("GBuy§" & Prop.PositionID)
        ''' Another code here....    
    End Sub
End Class

但是,当从另一个名为Trade的子系统中调用相同的子时,会出现问题:

Public Class tradeForm
    Private Sub Trade(sender As Object, e As EventArgs) Handles btnTrade.Click
        btnTrade.Enabled = False
        mainForm.SendHost("GATS§" & ID)
        'More code here...
        Me.Close()
    End Sub
End Class

这将启动mainForm中的sub,但Visual Studio告诉我" Client"是Null,给我一个NullReferenceExpection。使用btnBuy_Click不会发生这种情况。我不明白这一点,非常欢迎任何解决方案的提示!谢谢!随意提问。

plotForm和tradeForm的启动方式类似于(在mainForm中,不同的subs):

Dim TradeW As New Trade
TradeW.ShowDialog(Me)

Dim plotbox As New PlotBox
plotbox.ShowDialog(Me)

1 个答案:

答案 0 :(得分:0)

我认为你的主要问题是某个地方你正在挑选mainForm的错误(或新实例)。您正在使用mainForm的共享实例,这是一个完全糟糕的主意。我不知道为什么这个功能被引入到VB.NET中 - 它只会导致这样的错误。

我最终下载了你的项目并基本上手动将类mainForm重命名为mainFormClass,然后在整个类中引入了这段代码,直到你的项目编译完成:

Dim mainForm As mainFormClass

Public Sub New(mainForm As mainFormClass)

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

    Me.mainForm = mainForm

End Sub

我必须将每个表单的实例化更改为Dim propW As New PlotBox(Me.mainForm)Dim plotbox As New PlotBox(Me),具体取决于课程的制作地点。

我完成了所有编译工作,但我无法确定您的错误是否已解决,但我认为它已经解决了。