Poornima Santhosh Ответов: 0

Как получить список событий элементов управления parentform компонента?


Я создал компонент в одном проекте: например, используя UITypeEditor, чтобы установить некоторые пользовательские свойства для формы.

В моем другом проекте Windows forms applicaiton.
Я добавил этот компонент в Панель инструментов и использую в формах.
Прямо сейчас я получаю родительский компонент и все элементы управления родительской формы.

Но я хочу перечислить управляющие события, используемые в родительской форме во время разработки?

Что я уже пробовал:

Вот мой код, который я пробовал..

// Function to get the parent form
 public  Form setUpParentForm()
    {
             Form _parentForm = null;

       // if (_parentForm != null) return; // do nothing if it is set
       System.ComponentModel.Design.IDesignerHost host;
       if (Site != null)
       {
           host = Site.GetService(typeof(System.ComponentModel.Design.IDesignerHost)) as System.ComponentModel.Design.IDesignerHost;
           MessageBox.Show(host.ToString());
           object obj = host.GetService(typeof(Assembly)) as Assembly;
           
           if (obj != null)
           {

           }
           if (host != null)
           {

               if (host.RootComponent is Form)
               {
                   _parentForm = (Form)host.RootComponent;

                   MessageBox.Show("Host RootComponent ClassName: " + host.RootComponentClassName);
             
               }
           }
        
       }

        

        return _parentForm;
    }

// Function to get the control events list
 public static List<delegate> GetEventHandlerList(Form HostForm)
       {
           List<delegate> delegates = new List<delegate>();
           foreach (Control c in HostForm.Controls)
           {
               MessageBox.Show(c.Name.ToString());
               EventHandlerList events = (EventHandlerList)typeof(Component)
                .GetField("events", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public)
                .GetValue(c);

             
               object current = events.GetType()
                      .GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public)[0]
                      .GetValue(events);

              // MessageBox.Show("Current : " + current.ToString());
               while (current != null)
               {

                   delegates.Add((Delegate)GetField(current, "handler"));
                   current = GetField(current, "next");
               }

           }

           foreach (Delegate di in delegates)
           {
               MessageBox.Show(di.Method.ToString());
           }
           return delegates;
       }


       public static object GetField(object listItem, string fieldName)
       {
           return listItem.GetType()
              .GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField)
              .GetValue(listItem);
       }

Ralf Meier

Я думаю, что вы в основном ссылаетесь на эту статью из CP :
https://www.codeproject.com/Articles/34990/Get-Delegate-from-Event-s-Subscription

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

0 Ответов