Brak pola EventNodeMouseClick po użyciu typeof(Control).GetFields

0

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");
        }
    }
}

CopyEvents.zip

0
ALIENQuake napisał(a):

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.

Mnie odczyt takich rzeczy pachnie rekurencją.

0

Może dlatego, że typ Control nie zawiera takiego pola? Pewnie TreeView dziedziczy po Control i rozszerza o te eventy.
Możesz odwołać się bezpośrednio do kontrolki np. treeView.GetType() i w ten sposób sprawdzać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1