如何将EventHandler设置为等于另一个EventHandler

时间:2014-03-29 03:21:17

标签: c# winforms richtextbox eventhandler

我正在尝试为RichTextBox(RTB)创建扩展方法Clone()。

我想将新RTB的TextChanged事件处理程序设置为旧RTB的TextChanged事件处理程序。例如:

newRTB.TextChanged += oldRTB.TextChanged;

但是,出现以下错误:

“事件'System.Windows.Forms.Control.TextChanged'只能出现在+ =或 - =的左侧。”

一种可能的解决方案是将事件处理程序作为参数添加到克隆方法中,然后重新创建事件,但我需要为多个事件执行此操作,这会很麻烦。有什么想法吗?

“=”符号似乎也不起作用。

3 个答案:

答案 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);
       }
   }
}

现在像这样使用

这里我展示了复制clicktext changed事件的示例。

this.CopyEvent(richTextBox1, "EventText", "TextChanged", richTextBox2);
this.CopyEvent(richTextBox1, "EventClick", "Click", richTextBox2);

如何将其用于其他活动

您必须通过Reflector打开Control课程,然后获取fieldeventnames

所以在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
}