共用事件處理常式

承上篇,判斷檔案存在與否已解決,下載頁面的HyperLink只要在Load事件中判斷檔案是否存在,就可動態決定要導向download page或自訂的error page,此時出現另一個窘境:如果頁面有20個載點,那就要寫20個HyperLinks_Load事件,為了不使用這種浪費資源、維護困難的笨方法,就要善用「共用事件處理常式」!


首先列出可以共用的事件處理常式如下(以下簡稱H)
Protected Sub HyperLinks_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  '因為這邊的物件都是hyperlink我就偷懶不做轉型,直接以其Text屬性動態產生zip檔名
  Dim pathToCheck As String = "../download/" & sender.Text & ".zip"

 If (System.IO.File.Exists(Server.MapPath(pathToCheck))) Then
  '檔案路徑存在,將hyperlink之sender.NavigateUrl指定為動態產生的pathToCheck
   sender.NavigateUrl = pathToCheck
 Else
   '檔案路徑不存在,將hyperlink之sender.NavigateUrl指向自訂的錯誤頁面
  sender.NavigateUrl = "../myError.htm"
 End If
End Sub


再來和一般的事件處理常式比較(以下簡稱AA)
Protected Sub HyperLink1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles HyperLink1.Load
  Dim pathToCheck As String = "../download/" & HyperLink1.Text & ".zip"
  If (System.IO.File.Exists(Server.MapPath(pathToCheck))) Then
   HyperLink1.NavigateUrl = pathToCheck
 Else
  HyperLink1.NavigateUrl = "../myError.htm"
 End If
End Sub
用一般的事件處理常式,控制項越多程式碼會越龐大,在你仿照第1個控制項,做copy/paste動作撰寫其他控制項事件處理常式後,還要一個一個去改控制項的ID(注意粉紅色)!
所以事件處理常式的共用是非常重要的,除了精簡code還能避免手動更改控制項ID或其他變數時有漏改的情況產生,而且漏改通常不會無法編譯,可是每當在執行各事件處理常式時,漏改的part就是無法如願以償去執行正確的動作,此時code已經深如大海很難維護!


現在回頭看,我們已經有單一方法H來處理問題,但是H要怎麼知道是哪個控制項可引發事件?這時仔細觀察AA之所以能觸發HyperLink1的Load事件是因為有「Handles HyperLink1.Load」,所以只要在H後面加上要觸發的控制項事件即可,完整H如下
Protected Sub HyperLinks_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles HyperLink1.Load, HyperLink2.Load, HyperLink3.Load _ , HyperLink4.Load, HyperLink5.Load, HyperLink6.Load, HyperLink7.Load, HyperLink8.Load, HyperLink9.Load, HyperLink10.Load
 Dim pathToCheck As String = "../download/" & sender.Text & ".zip"
 If (System.IO.File.Exists(Server.MapPath(pathToCheck))) Then
   sender.NavigateUrl = pathToCheck
 Else
  sender.NavigateUrl = "../myError.htm"
 End If
End Sub

【注意】
1.參考網址http://msdn.microsoft.com/zh-tw/library/4ac48519.aspx
2.不想keyin也可用VSTS設計頁面(下圖),在每個控制項事件中指定「共用事件處理常式」,H就會自動為您加上要觸發的事件(黃色)。

沒有留言: