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
}
}
}
S'il vous plaît ne hésitez pas à marquer cela comme la réponse. –