2011-08-10 42 views
1

我试过没有成功,请遵循此处和其他论坛上给出的代码。我无法让事件发生。对由动态控件引发的事件的后期绑定 - 事件不会触发

手动添加到表单的相同控件工作正常......它引发了事件并且父表单消耗它。所以控制能够工作,而不是以我现在(到目前为止)试图用Reflection完成的方式。

我可以从这里下载的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

我姐夫给我的回答昨晚。只需要处理控制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 
    } 
} 

}

+0

请随时纪念这个作为回答。 –