2009-09-30 5 views
1

J'essaie de comprendre comment transmettre de manière déclarative dans un gestionnaire d'événements un contrôle utilisateur, mais je suis perplexe. Tout ce que je peux faire fonctionner est le gestionnaire d'événements du contrôle utilisateur. Je ne peux pas sembler lancer l'événement capturé dans la page parent. Les idées seraient les bienvenues. Voici mon code:Traitement des événements déclaratifs à partir du contrôle utilisateur ASP.NET à la 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> 

Merci!

Répondre

1

Voir ce post précédent:

Handling User Control Events on Containing Page

Edition - ajoutée en fonction de votre commentaire

Je aurais dû lire la question plus clairement.

Pour ce qui est d'avoir un UserControl déclencher un événement auquel la page contenant peut répondre, je ne crois pas que cela puisse être fait déclarativement. La seule manière d'y parvenir est de créer explicitement un événement dans le contrôle, puis de le gérer (en codant le gestionnaire d'événements) sur la page parente, comme indiqué dans l'exemple lié à .

+0

Désolé, je ne suis pas les autres messages ou ils n'expliquent pas ma situation (d'autant plus que je ne vois aucun attribut HTML et déclaratif assignant des gestionnaires d'événements.) – mycall

+0

Merci pour la réponse rapide. générer dynamiquement DropDownList dans le contrôle, comment le contrôle pourrait savoir quel gestionnaire d'événements de page appeler, sans passer dans le gestionnaire d'événements.Je suppose que je suis sur ma tête ici. – mycall

0

J'ai récemment eu ce même problème en C#. Lorsque vous configurez un événement appelé SelectedIndexChanged asp.net liera l'attribut OnSelectedIndexChanged lors de l'utilisation de la syntaxe déclarative.

Donc, si vous changez

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

Pour

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

Il devrait fonctionner.

Questions connexes