我正在尝试为RichTextBox(RTB)创建扩展方法Clone()。
我想将新RTB的TextChanged事件处理程序设置为旧RTB的TextChanged事件处理程序。例如:
newRTB.TextChanged += oldRTB.TextChanged;
但是,出现以下错误:
“事件'System.Windows.Forms.Control.TextChanged'只能出现在+ =或 - =的左侧。”
一种可能的解决方案是将事件处理程序作为参数添加到克隆方法中,然后重新创建事件,但我需要为多个事件执行此操作,这会很麻烦。有什么想法吗?
“=”符号似乎也不起作用。
答案 0 :(得分:1)
我们可以通过reflection
复制活动。现在我自己会担心这样做,所以请详尽地测试所有版本(2.0,3.0,4.0)。我尝试了很多方法,但以下是唯一的方法,我让它工作。在.NET 4.0上运行了Smoke测试。
在表单类
上创建扩展方法public static class FormExtension
{
public static void CopyEvent(this Form form, Control src, string fieldName, string eventName, Control dest)
{
EventHandlerList events = (EventHandlerList)typeof(Control)
.GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(src, null);
object key = typeof(Control).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
EventInfo evInfo = typeof(Control).GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);
Delegate del = events[key];
if (del != null)
{
Delegate d = Delegate.CreateDelegate(evInfo.EventHandlerType, form, del.Method);
MethodInfo addHandler = evInfo.GetAddMethod();
Object[] addHandlerArgs = { d };
addHandler.Invoke(dest, addHandlerArgs);
}
}
}
现在像这样使用
这里我展示了复制click
和text changed
事件的示例。
this.CopyEvent(richTextBox1, "EventText", "TextChanged", richTextBox2);
this.CopyEvent(richTextBox1, "EventClick", "Click", richTextBox2);
如何将其用于其他活动
您必须通过Reflector打开Control
课程,然后获取field
和eventnames
。
所以在Text Changed
的情况下,它就像是:
public event EventHandler TextChanged <-----The Event name for the "CopyEvent" function
{
add
{
base.Events.AddHandler(EventText, value);
}
remove
{
base.Events.RemoveHandler(EventText, value);
}
}
其中EventText
是
private static readonly object EventText = new object(); <-------The Field name
答案 1 :(得分:0)
如果您预先创建TextChanged事件,则可以在表单中放置两个TextBox和一个Button,这将使您的控件共享该事件。
private void button1_Click(object sender, EventArgs e)
{
textBox2.TextChanged += new EventHandler(textbox1_TextChanged);
}
private void textbox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("this");
}
<强>更新强>
在另一个文件中,创建您想要的方法,您可以获取当前事件的代码并在此方法中复制,然后您只需将其分配给新控件
void MyCloned_TextChanged(object sender, EventArgs e)
{
// Shared method OldRTB to share with NewRTB
}
在表单中,您将像这样使用它
public Form1()
{
InitializeComponent();
textBox1.TextChanged += new EventHandler(MyCloned_TextChanged);
textBox2.TextChanged += new EventHandler(MyCloned_TextChanged);
}
答案 2 :(得分:0)
试试这个:
newRTB.TextChanged += new TextChangedEventHandler(oldRTB_textChanged);
创建一个这样的方法:
void oldRTB_textChanged(object sender, EventArgs e)
{
// do something
}