用户控制事件处理程序订阅

本文关键字:程序 事件处理 控制 用户 | 更新日期: 2023-09-27 18:29:44

我有一个带有用户控件的windows窗体应用程序。我试图让UC调用主窗体上的函数,但当我添加UC时,主窗体看不到公共事件。

我的UC是这样的:

public partial class uctlLogin: UserControl
{
    public delegate void ButtonClickedEventHandler(object sender, EventArgs e);
    public event ButtonClickedEventHandler OnUserControlButtonClicked;
    public uctlLogin()
    {
        InitializeComponent();
        btnLogin.Click += new EventHandler(OnButtonClicked);
    }
    private void OnButtonClicked(object sender, EventArgs e)
    {
        if (OnUserControlButtonClicked != null)
            OnUserControlButtonClicked(this, e);
    }
}

我的表单代码是:

public partial class frmMain : Form
{
    UserControl uctlLogin1 = new TabletUserControls.uctlLogin();
    public frmMain()
    {
        InitializeComponent();
        uctlLogin1.OnUserControlButtonClicked += new EventHandler(OnUCButtonClicked);
    }
    private void OnUCButtonClicked(object sender, EventArgs e)
    {
        MessageBox.Show("Horray!");
    }
    private void frmMain_Load(object sender, EventArgs e)
    {
        this.Controls.Add(uctlLogin1);
    }
}

问题出在这一行:

uctlLogin1.OnUserControlButtonClicked += new EventHandler(OnUCButtonClicked);

生成以下消息:

"System.Windows.Forms.UserControl"不包含"OnUserControlButtonClicked"的定义,也不包含扩展方法"OnUserControlButtonClicked"接受类型为的第一个参数找不到"System.Windows.Forms.UserControl"(是否缺少使用指令还是程序集引用?)

我试着把UC放在同一个项目中,在一个单独的项目中创建UC,然后添加一个引用。在谷歌上搜索了几个小时后,我被卡住了。知道我在这里错过了什么吗?

顺便说一句,我使用的是针对.Net Framework 4.5的VS2012。

用户控制事件处理程序订阅

这是因为在frmMain中,您将uctlLogin1声明为UserControl,而不是uctlLogin。类型UserControl没有OnUserControlButtonClicked事件,编译器也不知道uctlLogin1uctlLogin的实例,因为您将其声明为UserControl。只要指定uctlLogin1的实际类型,它就会正常工作。