gpt4 book ai didi

c# - 是否可以将一个控件的事件处理程序 "steal"交给另一个控件?

转载 作者:可可西里 更新时间:2023-11-01 08:19:01 25 4
gpt4 key购买 nike

我想做这样的事情:

Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Take whatever event got assigned to btn1 and assign it to btn2.
btn2.Click += btn1.Click; // The compiler says no...

类中已经定义了 btn1_Click:

void btn1_Click(object sender, EventArgs e)
{
//
}

这当然不会编译(“事件 'System.Windows.Forms.Control.Click' 只能出现在 += 或 -= 的左侧)。有没有办法在运行时从一个控件获取事件处理程序并将其分配给另一个控件?如果那不可能,复制事件处理程序并在运行时将其分配给另一个控件是否可行?

几点:我已经用谷歌搜索了一段时间,但还没有找到解决方法。大多数尝试的方法都涉及反射,因此如果您阅读我的问题并认为答案非常明显,请先尝试在 Visual Studio 中编译代码。或者,如果答案真的非常明显,请随意打我一巴掌。谢谢,我真的很期待看看这是否可行。

我知道我可以这样做:

btn2.Click += new EventHandler(btn1_Click);

这不是我在这里寻找的。

这也不是我要找的:

EventHandler handy = new EventHandler(btn1_Click);
Button btn1 = new Button();
btn1.Click += handy;
Button btn2 = new Button();
btn2.Click += handy;

最佳答案

是的,这在技术上是可行的。需要反射,因为许多成员是私有(private)的和内部的。开始新的Windows Forms项目并添加两个按钮。然后:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += new EventHandler(button1_Click);
// Get secret click event key
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(button1, null);
Delegate click = events[secret];
// Remove it from button1, add it to button2
events.RemoveHandler(secret, click);
events = (EventHandlerList)eventsProp.GetValue(button2, null);
events.AddHandler(secret, click);
}

void button1_Click(object sender, EventArgs e) {
MessageBox.Show("Yada");
}
}
}

如果这让您相信 Microsoft 非常努力地阻止您这样做,那么您就理解了代码。

关于c# - 是否可以将一个控件的事件处理程序 "steal"交给另一个控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/293007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com