2009-09-30 43 views
1

我想弄清楚如何聲明性地將事件處理程序傳遞到用戶控件的 ,但我很難過。我所能做的所有事情都是用戶控件的 事件處理程序..我似乎無法將捕獲的事件冒泡到父級 頁面。想法會非常受歡迎。這裏是我的代碼:從ASP.NET用戶控件的聲明性事件處理到頁面

的Default.aspx:

<%@ Page Language="VB" %> 
<%@ Register TagPrefix="rpt" TagName="filter" Src="WebUserControl.ascx" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test Controls</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <rpt:filter ID="DataView1Filters" runat="server" SelectedIndexChanged="DropDown_SelectedIndexChanged" />  
     <asp:Label ID="Label1" runat="server" /> 
    </form> 

<script runat="server"> 
    Public Sub DropDown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) 
     Label1.Text = String.Format("Inside declarative event handler. {0}<br>", Label1.Text) 
    End Sub 
</script> 

</body> 
</html> 

WebUserControl.ascx:

<%@ Control Language="VB" ClassName="WebUserControlTest" %> 

<asp:Panel ID="TestPanel" runat="server"></asp:Panel> 

<script runat="server"> 

Private AllEvents As New System.ComponentModel.EventHandlerList 
Public Custom Event SelectedIndexChanged As EventHandler 
    AddHandler(ByVal value As EventHandler) 
     AllEvents.AddHandler("SelectedIndexChanged", value) 
    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 
     AllEvents.RemoveHandler("SelectedIndexChanged", value) 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
     Dim value As EventHandler = CType(AllEvents("SelectedIndexChanged"), EventHandler) 
     If Not value Is Nothing Then 
      value.Invoke(sender, e)     
     End If 
    End RaiseEvent 
End Event 

Private Sub _SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) 
    Dim ctrl As DropDownList = Me.FindControl("TestDropDownList") 
    If Not ctrl Is Nothing Then 
     Me.ViewState("ItemSelection") = ctrl.SelectedIndex 
    End If 
    Dim Label1 As Label = Parent.FindControl("Label1") 
    Label1.Text = String.Format("Inside user control event handler. {0}<br>", Label1.Text) 
    RaiseEvent SelectedIndexChanged(sender, e) 
End Sub 

Private Overloads Sub OnLoad(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    Dim ctrl As New DropDownList 
    With ctrl 
     .ID = "TestDropDownList" 
     .Items.Clear() 
     .AutoPostBack = True 
     AddHandler .SelectedIndexChanged, AddressOf _SelectedIndexChanged 
     .Items.Add(New ListItem("-- Select --", String.Empty)) 
     .Items.Add(New ListItem("Item 1", "1")) 
     .Items.Add(New ListItem("Item 2", "2")) 
     If Not Me.ViewState("ItemSelection") Is Nothing Then 
      .SelectedIndex = CInt(Me.ViewState("ItemSelection")) 
     Else 
      .SelectedIndex = 0 
     End If 
    End With 
    TestPanel.Controls.Add(ctrl) 
End Sub 

</script> 

謝謝!

回答

1

看到這個以前的帖子:

Handling User Control Events on Containing Page

編輯 - 添加基於您的評論

我應該更清楚地看問題。

至於有用戶控件引發一個事件包含頁可以迴應,我不相信這是可以做到聲明

除非我的知識只是缺乏,否則唯一的方法就是在控件中顯式創建一個事件,然後在父頁面上處理它(通過編碼事件處理程序),如示例I鏈接到。

+0

對不起,我不跟隨其他帖子,或者他們沒有解釋我的情況(特別是因爲我沒有看到任何HTML和聲明屬性分配事件處理程序 – mycall 2009-09-30 03:13:25

+0

感謝您的快速回復。動態生成控件中的DropDownList,控件如何知道要調用哪個頁面事件處理函數,而無需傳入事件處理函數,我想我已經過了頭。 – mycall 2009-09-30 03:49:41

0

我最近在C#中有這個相同的問題。當您設置一個名爲SelectedIndexChanged的事件時,asp.net將在使用聲明性語法時綁定屬性OnSelectedIndexChanged

所以,如果你改變

<rpt:filter ID="DataView1Filters" runat="server" SelectedIndexChanged="DropDown_SelectedIndexChanged" /> 

<rpt:filter ID="DataView1Filters" runat="server" OnSelectedIndexChanged="DropDown_SelectedIndexChanged" /> 

它應該工作。

相關問題