我的用户控件出错

时间:2011-04-22 08:40:01

标签: c# winforms

HI有人可以建议如何解决这个错误吗?  我得到了这个帖子here的回复,但遗憾的是作者没有回复。所以我决定再次发布他的解决方案。

错误:错误1无法将类型'project1.Utility.AdminController.AdminControllerEvent'隐式转换为'System.EventHandler'

当我想挂钩

时发生错误

//btnDelete.Click += new AdminControllerEvent(btnDelete_Click);

namespace project1.Utility
{   
    public partial class AdminController : UserControl
    {
        public delegate void AdminControllerEvent(object sender, AdminControllerEventArgs e);

    public event AdminControllerEvent SaveClick;
    public event AdminControllerEvent DeleteClick;

    public AdminController()
    {
        InitializeComponent();
        //btnDelete.Click += new AdminControllerEvent(btnDelete_Click);
    }

    private void btnDelete_Click(object sender, AdminControllerEventArgs e)
    {
        if (DeleteClick != null)
        {
            if (MessageBox.Show(CoreMessages.DeleteAsk, CoreMessages.DeleteAsk, MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                DeleteClick(sender, e);

                if (AdminControllerEventArgs.Success)
                {
                    MessageBox.Show(CoreMessages.DeleteSuccess, CoreMessages.Successful, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(CoreMessages.DeleteFailed, CoreMessages.Failed, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
    }
}

public class AdminControllerEventArgs : EventArgs
{
    public static bool Success;

    public AdminControllerEventArgs()
        : base()
    {
        Success = true;
    }
}

}


在我的表单中删除用户界面

 private void adminController_DeleteClick(object sender, AdminControllerEventArgs e)
    {
        Repository.Delete(user);
    }

3 个答案:

答案 0 :(得分:1)

事件Click期望处理程序实现System.EventHandler描述的签名。这不起作用 - 您必须更改签名或为Click实现自己的附加处理程序,这会引发另一个调用自定义处理程序的事件。我不太确定你在这里尝试将事件处理程序代码与其他UI消息混合等。

答案 1 :(得分:1)

这里的问题是方法的签名。按钮单击事件没有要传递的事件数据,按照惯例,它们有两个参数。

由于没有要传递的事件数据,因此使用 EventArgs ,因此您已经实现了按钮单击并不知道该错误

答案 2 :(得分:0)

Button.Click将使用普通EventArgs参数引发Click事件。您不能指望Click(object sender, EventArgs e)使用更具体的方法签名(使用AdminControllerEventArgs参数)。如何将EventArgs转换为AdminControllerEventArgs?

想象一下它的工作原理。会发生什么:

  • 按钮。点击创建new EventArgs()
  • 按钮。点击您的btnDelete_Click(this, args)
  • args应为AdminControllerEventArgs
  • 类型
  • ...但实际上是EventArgs
  • btnDelete_Click中的代码尝试访问args.Success属性
  • ...不存在,因为EventArgs没有

不幸的是,你需要一个解决方法。