2011-08-10 2 views
1

J'ai essayé sans succès de suivre le code donné ici et sur d'autres forums. Je ne peux tout simplement pas déclencher l'événement.Liaison tardive à un événement déclenché par un contrôle dynamique - l'événement ne se déclenche pas

Le même contrôle ajouté manuellement au formulaire fonctionne correctement ... il déclenche l'événement et le formulaire parent le consomme. Donc, le contrôle est capable de fonctionner, mais pas de la façon dont je suis (jusqu'à présent) en train de le faire avec Reflection.

J'ai une petite démo de l'application web disponible en téléchargement ici:

http://ube.dev.campuswebstore.mobi/dloadfile.htm

Voici le code et je vais commenter où je suis en train de relier l'événement au gestionnaire (la partie qui ne fonctionne pas):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Reflection; 

namespace WebApplication2 
{ 
    public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Init(object sender, System.EventArgs e) 
    { 

     TestRaiseEvent77.ButtonClickEvent += new ButtonWasClicked(TestRaiseEvent77_ButtonClickEvent); 

     string layout = ""; 

     if (Request.QueryString["layout"] != null) 
     { 
      layout = Request.QueryString["layout"] as string; 
     } 
     else 
     { 
      layout = "default"; 
     } 


     if (!Page.IsPostBack) 
     { 
      GlobalMethods.InitControlList(); 
      LoadControls(layout); 
      AddControlsFromList(); 
      WireControlEventsToHandlers(); 
     } 
     else 
     { 
      AddControlsFromList(); 
      WireControlEventsToHandlers(); 
     } 
    } 

    void TestRaiseEvent77_ButtonClickEvent(string message) 
    { 

    } 



    private void AddControlsFromList() 
    { 

     sitemanagercontrolsdiv.Controls.Clear(); 

     try 
     { 
      if (GlobalMethods.divlayoutgencontrols != null) 
      { 
       foreach (Control c in GlobalMethods.divlayoutgencontrols) 
       { 
        sitemanagercontrolsdiv.Controls.Add(c); 
       } 
      } 
     } 
     catch (Exception eee) 
     { 
      string a = eee.Message; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 



    } 

// NOTES:

//The control collection cannot be modified during 
    //DataBind, 
    //Init, 
    //Load, 
    //PreRender or 
    //Unload phases. 


    private void WireControlEventsToHandlers() 
    { 
     foreach (Control c in sitemanagercontrolsdiv.Controls) 
     {     
      Type controlType = c.GetType(); 

      BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public; 
      EventInfo[] myEvents = controlType.GetEvents(myBindingFlags); 

      for (int j = 0; j < myEvents.Count(); j++) 
      { 
       string eventName = myEvents.ElementAt(j).Name; 
       if (eventName == "ButtonClickedEvent") 
       { 
        MethodInfo handler = typeof(_Default).GetMethod("SomeHandler"); 
        Delegate del = Delegate.CreateDelegate(myEvents.ElementAt(j).EventHandlerType, this, handler); 

//////////////////////////////// CE QUELLE QUE SOIT FAIT IL NE FONCTIONNE PAS

    myEvents.ElementAt(j).AddEventHandler(c, del); 
       } 
      } 

      c.Visible = true; 
      string tempGUID = Guid.NewGuid().ToString(); 
      c.ID = "TestRaiseEvent" + tempGUID + "1"; 
     } 

    } 

    private void LoadControls(string layout) 
    { 
     Control c = LoadControl("~/TestRaiseEvent.ascx"); 

     GlobalMethods.divlayoutgencontrols.Add(c); 
    } 

////////////////// Je suis en train de LIER CAS dE CE handler:

public void SomeHandler(string message) 
    { 
     // do something 
    } 
} 

}

Répondre

0

Mon beau-frère m'a donné la réponse hier soir. Juste quelques changements mineurs ayant à traiter avec l'ID du contrôle.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Reflection; 

namespace WebApplication2 
{ 
public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_PreInit(object sender, System.EventArgs e) 
    { 
     string layout = ""; 

     if (Request.QueryString["layout"] != null) 
     { 
      layout = Request.QueryString["layout"] as string; 
     } 
     else 
     { 
      layout = "default"; 
     } 


     //if (!Page.IsPostBack) { 
     GlobalMethods.InitControlList(); 
     LoadControls(layout); 
     //} 

    } 

    private void AddControlsFromList() 
    { 

     sitemanagercontrolsdiv.Controls.Clear(); 

     try 
     { 
      if (GlobalMethods.divlayoutgencontrols != null) 
      { 
       foreach (Control c in GlobalMethods.divlayoutgencontrols) 
       { 
        sitemanagercontrolsdiv.Controls.Add(c); 
       } 
      } 
     } 
     catch (Exception eee) 
     { 
      string a = eee.Message; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     AddControlsFromList(); 
    } 


    //The control collection cannot be modified during 
    //DataBind, 
    //Init, 
    //Load, 
    //PreRender or 
    //Unload phases. 

    protected void Page_LoadComplete(object sender, EventArgs e) 
    { 
     //AddControlsFromList(); 
    } 

    private void LoadControls(string layout) 
    { 
     Control c = LoadControl("~/TestRaiseEvent.ascx"); 

     Type controlType = c.GetType(); 

     BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public; 
     EventInfo[] myEvents = controlType.GetEvents(myBindingFlags); 

     for (int j = 0; j < myEvents.Count(); j++) 
     { 
      string eventName = myEvents.ElementAt(j).Name; 
      if (eventName == "ButtonClickEvent") 
      { 
       MethodInfo handler = typeof(_Default).GetMethod("SomeHandler"); 
       Delegate del = Delegate.CreateDelegate(myEvents.ElementAt(j).EventHandlerType, this, handler); 
       myEvents.ElementAt(j).AddEventHandler(c, del); 
      } 
     } 

     c.Visible = true; 
     //string tempGUID = Guid.NewGuid().ToString(); 
     //c.ID = "TestRaiseEvent" + tempGUID + "1"; 
     c.ID = "TestRaiseEvent1"; 

     GlobalMethods.divlayoutgencontrols.Add(c); 
    } 


    public void SomeHandler(string message) 
    { 
     // do something 
    } 
} 

}

+0

S'il vous plaît ne hésitez pas à marquer cela comme la réponse. –

Questions connexes