Позднее связывание с событием, вызванным динамическим элементом управления - событие не запускается - PullRequest
1 голос
/ 11 августа 2011

Я безуспешно пытался следовать коду, приведенному здесь и на других форумах.Я просто не могу запустить событие.

Тот же элемент управления, добавленный вручную в форму, работает нормально ... он вызывает событие, и родительская форма использует его.Таким образом, элемент управления способен работать, но не так, как я (пока) пытаюсь сделать это с помощью Reflection.

У меня есть небольшая демонстрационная версия веб-приложения, доступная для загрузки здесь:

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
    }
}

} ​​

1 Ответ

0 голосов
/ 11 августа 2011

Мой зять дал мне ответ прошлой ночью.Всего несколько небольших изменений, связанных с идентификатором элемента управления.

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
    }
}

}

...