2013-02-11 89 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