2013-02-11 85 views
2

我想出了一个解决方案,但解决了我的问题,但我很好奇为什么我最初的方法失败了。我的情况是,如下所述:事件只会引发一次?

我有一个引发事件的一种形式:

Public Class frmDgvLb 

    Public Delegate Sub ProfileChanged() 
    Public Event UpdateProfile As ProfileChanged 

    Private Sub lbDgvEdit_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lbDgvEdit.SelectedIndexChanged 
     If UpdateHotlist(cmdStr) = True Then 
      If DgvName = "dgvHotlist" Then 
       Hotlist.LoadDGV() 
      ElseIf DgvName = "dgvJobProfile" Then 
       RaiseEvent UpdateProfile() 
      End If 
      Me.Close() 
     End If 
    End Sub 

End Class 

我有该事件的定义和处理的另一种形式:

Public Class frmGraph 

    Public Sub New() 
     InitializeComponent() 
     AddHandler frmDgvLb.UpdateProfile, AddressOf RefreshProfiles 
    End Sub 

    Public Sub RefreshProfiles() 
     GetProfiles(lbMach.SelectedItem, dtpJobDate.Value) 
     CreateGraph(dtpJobDate.Value, _machList) 
     zgc.Refresh() 
    End Sub 

End Class 

我的问题是, RaiseEvent UpdateProfile()只会执行一次。列表框的所有后续索引更改都不会引发该事件?在逐步调试时,当条件计算为true时,调试器将跳至RaiseEvent行,然后跳至关闭条件语句的行,并且RefreshProfile Sub从不执行。同样,第一次列表框的索引改变时,一切正常。为什么是这样?

+0

你需要停止使用*类名*的习惯,frmDgvLb,仿佛它是的一个实例类。当你这样做的时候,有很多方法会丢失,特别是当你多次创建表单或者使用线程时。 – 2013-02-11 17:17:55

回答

1

你必须处理程序添加到实例,而不是类:

Public Sub New() 
    InitializeComponent() 
    AddHandler frmDgvLbInstance.UpdateProfile, AddressOf RefreshProfiles 
End Sub 
+0

谢谢SysDragon,那就是问题所在。通过提升和处理事件来进行形式间沟通的优点和缺点,而不是直接调用公共子类。 – user1017477 2013-02-11 19:20:08