重定向事件按钮委托事件 [英] Redirect event button delegate event

查看:106
本文介绍了重定向事件按钮委托事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在WinForm上有一个单独的控制器UserControl 1Panel + 2Button



我尝试了什么:



命名空间TestToolBar1 
{
public partial class UserControl1:UserControl
{
private System.ComponentModel.Container components = null;

public UserControl1()
{
InitializeComponent();
}

//定义一个事件处理程序委托,它基本上重用现有的
//签名
public delegate void EventHandler(object sender,System.EventArgs e );
// decalre事件处理程序委托
EventHandler EventHandlerDelegate;
//重新定义Click事件
新公共事件EventHandler单击
{
//这相当于Click + = new EventHandler(...)
添加
{
this.EventHandlerDelegate + = value;
}
//这相当于Click - = new EventHandler(...)
remove
{
this.EventHandlerDelegate - = value;
}
}

//转发按钮的点击事件
private void button_Click(object sender,System.EventArgs e)
{
if(this.EventHandlerDelegate!= null)
this.EventHandlerDelegate(sender,e);
}
}
}





和表格上的声明



命名空间TestToolBar1 
{
public partial class Form2:Form
{
private TestToolBar1.UserControl1 userControl11;
private System.ComponentModel.Container components = null;

public Form2()
{
InitializeComponent();


UserControl1 myctrl = new UserControl1();
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.Show();
}
....

private void userControl_Click1(object sender,System.EventArgs e)
{
Control ctrl = sender as Control;
MessageBox.Show(message);
}





问题EventHandlerDelegate总是空的而不是重定向



 private void button_Click(object sender,System.EventArgs e)
{
if(this.EventHandlerDelegate!= null)
this.EventHandlerDelegate(sender,e) ;
}

解决方案

它是null,因为你没有在任何时候为它添加一个处理程序:你提供代码,你创建控件实例,但你不添加处理程序。



如果没有添加处理程序,处理程序中没有任何动作收藏!

我是这样做的:

UserControl1:

 ///< summary> 
///表示事情发生的事件
///< / summary>
公共事件EventHandler SomethingHappened;
///< summary>
///被叫来向订阅者发出SomethingHappened
///< / summary>
///< param name =e>< / param>
protected virtual void OnSomethingHappened(EventArgs e)
{
EventHandler eh = SomethingHappened;
if(eh!= null)
{
eh(this,e);
}
}

//转发按钮的点击事件
private void button1_Click(object sender,System.EventArgs e)
{
EventHandler eh = SomethingHappened;
if(eh!= null)
{
eh(this,e);
}
}



表格:

 UserControl1 myctrl = new UserControl1 (); 
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.SomethingHappened + = myctrl_SomethingHappened;
myctrl.Show();

 void myctrl_SomethingHappened(object sender,EventArgs e)
{
Console.WriteLine(It happen!);
}

如果您看一下:添加事件的简单代码片段 [ ^ ]它会自动添加事件的过程(只需键入evh并按Tab键,它就会填充空白)


I Have a separate contro UserControl 1Panel + 2Button on WinForm

What I have tried:

namespace TestToolBar1
{
    public partial class UserControl1 : UserControl
    {
        private System.ComponentModel.Container components = null;

        public UserControl1()
        {
            InitializeComponent();
        }
      
        // define an event handler delegate which basically re-uses an existing
        // signature
        public delegate void EventHandler(object sender, System.EventArgs e);
        // decalre an event handler delegate
        EventHandler EventHandlerDelegate;
        // re-define the Click event
        new public event EventHandler Click
        {
            // this is the equivalent of Click += new EventHandler(...)
            add
            {
                this.EventHandlerDelegate += value;
            }
            // this is the equivalent of Click -= new EventHandler(...)
            remove
            {
                this.EventHandlerDelegate -= value;
            }
        }

        // forward the button's click event 
        private void button_Click(object sender, System.EventArgs e)
        {
            if (this.EventHandlerDelegate != null)
                this.EventHandlerDelegate(sender, e);
        }       
    }
}



and the declaration on Form

namespace TestToolBar1
{
    public partial class Form2 : Form
    {
        private TestToolBar1.UserControl1 userControl11;
        private System.ComponentModel.Container components = null;

        public Form2()
        {
            InitializeComponent();


            UserControl1 myctrl = new UserControl1();
            myctrl.Top = 0;
            myctrl.Left = 0;
            myctrl.Parent = panel1;
            myctrl.Show();
        }
....

 private void userControl_Click1(object sender, System.EventArgs e)
        {
            Control ctrl = sender as Control;
            MessageBox.Show("message");
        }



problem EventHandlerDelegate is always Null and not redirect

private void button_Click(object sender, System.EventArgs e)
       {
           if (this.EventHandlerDelegate != null)
               this.EventHandlerDelegate(sender, e);
       }

解决方案

It's null because you haven't added a handler to it at any point: you provide the code, you create the control instance, but you don't add a handler.

And if no handler is added, there is nothing to action in the handler collection!
Here is how I'd do it:
UserControl1:

/// <summary>
/// Event to indicate SomethingHappened
/// </summary>
public event EventHandler SomethingHappened;
/// <summary>
/// Called to signal to subscribers that SomethingHappened
/// </summary>
/// <param name="e"></param>
protected virtual void OnSomethingHappened(EventArgs e)
    {
    EventHandler eh = SomethingHappened;
    if (eh != null)
        {
        eh(this, e);
        }
    }

// forward the button's click event
private void button1_Click(object sender, System.EventArgs e)
    {
    EventHandler eh = SomethingHappened;
    if (eh != null)
        {
        eh(this, e);
        }
    }


Form:

UserControl1 myctrl = new UserControl1();
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.SomethingHappened += myctrl_SomethingHappened;
myctrl.Show();

void myctrl_SomethingHappened(object sender, EventArgs e)
    {
    Console.WriteLine("It happened!");
    }

If you have a look here: A Simple Code Snippet to Add an Event[^] it automates the process of adding an event (just type "evh" and press tab, and it fills in the blanks)


这篇关于重定向事件按钮委托事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆