簡體   English   中英

從ASP.NET用戶控件到頁面的聲明性事件處理

[英]Declarative event handling from ASP.NET user control to page

我試圖弄清楚如何以聲明方式將事件處理程序傳遞給用戶控件,但是我很困惑。 我所能做的就是用戶控件的事件處理程序。我似乎無法將捕獲的事件冒泡到父頁面中。 想法將非常受歡迎。 這是我的代碼:

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>

謝謝!

參見上一篇文章:

處理包含頁面上的用戶控件事件

編輯-根據您的評論添加

我應該更清楚地閱讀這個問題。

就讓UserControl引發包含頁面可以響應的事件而言,我不認為這可以聲明性地完成。

除非僅缺乏我的知識,否則完成此操作的唯一方法是在控件中顯式創建一個事件,然后在父頁面上對其進行處理(通過對事件處理程序進行編碼),如我鏈接的示例所示。

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

所以如果你改變

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

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

它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM