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

时间:2014-11-09 21:50:35

标签: c# winforms

我有一个带有用户控件的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,然后添加对它的引用。谷歌搜索了几个小时后,我被卡住了。知道我在这里缺少什么吗?

BTW,我正在使用针对.Net Framework 4.5的VS2012。

1 个答案:

答案 0 :(得分:3)

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