2009-09-30 33 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" /> 

它应该工作。

相关问题