【发布时间】:2013-12-25 06:32:05
【问题描述】:
好的,我有 2 个班级可以将标签页添加到 tabcontrol
- 通信:类,使用事件
- GeneralChat : UserControl,双击列表框中的名称
我的做法是这样的
以下函数来自GeneralChat
双击新建标签页时的处理
Private Sub ListConnecte_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles ListConnecte.MouseDoubleClick
addTab(ListConnecte.SelectedItems(0)) 'I've simplified the function, but it's not passing an empty value
End Sub
创建标签页
Private Sub addTab(sUser As String)
Dim tp As New TabPage(sUser)
Dim pc As New PrivateChat(Me, weComs, sUser)
pc.Dock = DockStyle.Fill
tp.Controls.Add(pc)
If (Me.InvokeRequired) Then
Me.Invoke(New AddTabDelegate(AddressOf MainForm.addTab), tp)
Else
MainForm.addTab(tp)
End If
listChat.Add(sUser, tp)
End Sub
然后进入创建变量TabControlChat的主窗体,并将其添加到TabControlChat.TabPages
所以我的问题是,当我双击时,一切正常,但是当我这样称呼它时
Private Sub ReceivedString_weComs(Sender As Object, e As WithParamReceivedString) Handles weComs.ReceivedString
Select Case e.Identifier
Case Communication.enumTags.PrivateChat
Dim sNom() As String = e.ReceivedString.Split(New String() {"#*#"}, StringSplitOptions.RemoveEmptyEntries)
If (Not listChat.ContainsKey(sNom(0))) Then
addTab(sNom(0))
Else
RaiseEvent PrivateChatString(Me, New ReceivedStringEventArgs(e.ReceivedString))
End If
End Select
End Sub
所以这个函数和之前调用的路径相同,但是添加了 tabcontrol 而不是从 Communication 类中添加的
我真的尝试了很多,如果我不够清楚,请再问我有关调试的问题,希望您能帮助:S
【问题讨论】:
-
您在 Invoke 调用中对 MainForm 的使用是问题所在。 MainForm 是一种类型,它不是对象。在 VB.NET 中很方便,但在工作线程上运行的代码中绝对致命。现在“MainForm”成为另一个 MainForm 对象的一个实例。一个由工作线程拥有并且不可见,因为它的 Show() 方法从未被调用过。您必须使用对用户正在查看的 MainForm 对象的正确引用。像我一样。
标签: .net vb.net multithreading events tabcontrol