2011-08-10 18 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); 

////////////////////////////////これはそれをやっているWHATEVERが動作していない

    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

答えとしてこれをマークすること自由に感じなさい。 –

関連する問題