Windows窗体 - 使用公共事件将窗体订阅到用户控件事件

时间:2013-03-20 08:52:15

标签: c# winforms events delegates

在处理活动和/或代表时遇到问题。我看到了非常相似的问题,但我仍然不清楚真正的实施情况。所以,当你回答更具体的问题时,我可以尝试并最终了解如何通过我所知道的代码来完成公共/自定义事件的创建/处理工作。

我所拥有的是User Control,它只是一个文本框和一个按钮,我需要使用文本框中的值更改数据库中的记录。我正在使用这个控件用于许多表单,所以我需要知道我正在使用哪个实体并且能够调用它自己的save方法。如果我可以使用click按钮的User Control事件,然后调用当前表单的Save()方法,那么这样做会更容易。

这是我的用户控制:

namespace UserControls.CommonControls
{
    public delegate void ClickMe(string message);

    public partial class ChangeCode : UserControl
    {
        public event ClickMe CustomControlClickMe;
        public ChangeCode()
        {
            InitializeComponent();
        }

        private void btnChange_Click(object sender, EventArgs e)
        {
            if (CustomControlClickMe != null)
                CustomControlClickMe("Hello");
           //ToDo fill
            //MessageBox.Show("To Do: Write the busieness logic.");
        }

        public void SetTextBoxMask(MaskedTextBox txtBox)
        {
            txtChange.Mask = txtBox.Mask;
        }
    }
}

我发布了最后一次尝试尝试实现我需要的东西。

这是需要使用Click中的User Control事件以及Constructor更具体的事件之一,因为如果我理解正确,我必须订阅的地方对于该事件:

public MaterialEdit()
        {
            InitializeComponent();
            UserControls.CommonControls.ChangeCode. += new ClickMe(button2_Click);
        }

UserControls.CommonControls.ChangeCode - 这就是我将User Control命名为ChangeCode的方式。

1 个答案:

答案 0 :(得分:1)

根据您粘贴的内容,您不清楚是否在表单中添加了ChangeCode控件。要使用控件及其事件和属性,首先必须为其创建新实例并将其添加到表单中。这样做了:

  • 在设计器中,通过将控件从Toolbox拖到窗体
  • 在代码编辑器中,通过调用控件构造函数并将新对象添加到控件集合

只有这样才能处理该对象的事件。假设您将ChangeCode控件删除到表单,并且Visual Studio将其命名为ChangeCode1。您将处理的事件附加到此CustomControlClickMe事件:

ChangeCode1.CustomControlClickMe += new ClickMe(button2_Click);

您粘贴的代码(UserControls.CommonControls.ChangeCode. += new ClickMe(button2_Click);)不正确有以下几个原因:

  1. 从句法上讲,左侧表达式以.结尾,这使得分配目标不正确(UserControls.CommonControls.ChangeCode.
  2. 未提供事件名称,仅提供控件名称(您需要在分配的左侧结束您想要分配的内容 - .CustomControlClickMe
  3. 您正在尝试将处理程序附加到类而不是对象