Как получить список событий элементов управления 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 (только цикл, который повторяется через коллекцию элементов управления формы).