2013-06-27 42 views
0

這是我的情況。我有一個嵌套在每一行中的自定義用戶控件(UC1)的gridview(gridview1)。自定義用戶控件具有一個名爲「TaskChanged」的自定義公共事件,單擊按鈕時會引發該事件。在父頁面(default.aspx),我試圖訪問用戶控件來附加事件處理程序,但我不成功。以下是我想要做的事情。如何將事件處理程序附加到嵌套的自定義用戶控件? VB.net

在父頁面:

Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound 
If e.Row.RowType = DataControlRowType.DataRow Then 
     'Get the User Control 
     Dim Uc As UserControl = e.Row.FindControl("TaskResourceAssignment") 
     'Attatch event handler 
     AddHandler Uc.TaskChanged, AddressOf Uc_OnTaskChanged 


    End If 
End Sub 

的問題是,在這條線:

AddHandler Uc.TaskChanged, AddressOf Uc_OnTaskChanged 

它無法找到控制的「TaskChanged」事件(Uc.TaskChanged得到波浪線在它下面),並運行該頁面只會引發錯誤。我記得有一位朋友能夠做到這一點,但他將用戶控件作爲對象投入使用,並能夠訪問它。我已經嘗試過,沒有運氣。

自定義控件引發事件而不是冒泡事件。我可以通過冒泡事件來實現它,但我真的想通過將事件處理程序附加到控件來實現它。幫助任何人?

+0

事件標有'Friend'或'Public'嗎?所以它可以在這裏訪問。 – OneFineDay

+0

其標記爲Public: – Quinn

+0

Public Event TaskChanged As System.EventHandler – Quinn

回答

0

您需要明確地將用戶控件強制轉換爲特定的控件,因爲常規UserControl沒有TaskChanged事件。

事情是這樣的 -

Dim Uc = TryCast(e.Row.FindControl("TaskResourceAssignment"), 
    TaskResourceAssignment) 
+0

謝謝贏了,這是我的問題的解決方案。一旦我將類型名稱更改爲類名稱,一切都奏效了。非常感謝!! – Quinn

0

的問題是,用戶控件不具有TaskChanged事件。 FindControl返回的類型Control也不是。

你的朋友將控件投入特定的控件,以便能夠附加正確的事件。

在這種情況下,我相信你正在尋找ITaskService.OnTaskChanged事件。所以我會試試這個:

Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound 
If e.Row.RowType = DataControlRowType.DataRow Then 
     'Get the User Control 
     Dim Uc As UserControl = DirectCast(e.Row.FindControl("TaskResourceAssignment"), ITaskService) 
     'Attatch event handler 
     AddHandler Uc.OnTaskChanged, AddressOf Uc_OnTaskChanged 


    End If 
End Sub 
+0

謝謝jtseng,但我想提出一個自定義事件,不一定是現有的事件。通過將演員類型更改爲類名,我能夠找到控件的事件。 – Quinn

0

我喜歡使用Trycast這種類型的工作。將MyUserControl替換爲您的UserControl的名稱。

Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
    'Get the User Control 
    Dim Uc As MyUserControl = TryCast(e.Row.FindControl("TaskResourceAssignment"), ITaskService) 
    If Not Uc Is Nothing Then 
     AddHandler Uc.OnTaskChanged, AddressOf Uc_OnTaskChanged 
    End If 
    End If 
End Sub 
相關問題