我遇到了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)
答案 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)
,具体取决于课程的制作地点。
我完成了所有编译工作,但我无法确定您的错误是否已解决,但我认为它已经解决了。