我已经尝试过没有成功地遵循此处和其他论坛上提供的代码。我不能让事件发生。
手动添加到表单的相同控件工作正常...它引发事件,父表单使用它。所以控件能够工作,而不是像我(到目前为止)试图用反射做的那样。
我在这里可以下载一个小型的Web应用程序DEMO:
http://ube.dev.campuswebstore.mobi/dloadfile.htm
以下是代码,我将评论我在哪里尝试将事件链接到处理程序(不起作用的部分):
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)
{
}
//注意:
//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);
////////////////////////////////如果这样做不起作用
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);
}
//////////////////我想把这个事件联系到这个处理者:
public void SomeHandler(string message)
{
// do something
}
}
}
答案 0 :(得分:0)
我的姐夫昨晚给了我答案。只需要处理控件ID的一些小改动。
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
}
}
}