Próbuję skopiować event'y kontrolki Windows Forms TreeView1 do TreeView2 używając poniższego kodu. Udaje się z niektórymi np "EventClick" ale np "NodeMouseClick" brakuje na liście pól po wywołaniu metody GetFields. Linia var allFields = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Default);
nie zwraca mi NodeMouseClick.
Czy NodeMouseClick jest jakimś specjalnym Event'em któy jest ukryty? Jak dostać ten event z kontrolki typu TreeView?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CopyEvents
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Get secret click event key
var allFields = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Default);
FieldInfo eventNodeMouseClick = typeof(Control).GetField("EventNodeMouseClick", BindingFlags.NonPublic);
FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
object secret = eventClick.GetValue(null);
// Retrieve the click event
PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList events = (EventHandlerList)eventsProp.GetValue(treeView1, null);
Delegate click = events[secret];
// Remove it from button1, add it to button2
//events.RemoveHandler(secret, click);
events = (EventHandlerList)eventsProp.GetValue(treeView2, null);
events.AddHandler(secret, click);
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
MessageBox.Show("Hello from NodeMouseClick");
}
private void treeView1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello from Click");
}
}
}