首页>Program>source

我有一个包含3个标签的UserControl.我想为其添加一个事件,该事件在其中一个标签的文本更改时发生。
我正在使用Visual Studio 2010

最新回答
  • 2021-1-12
    1 #

    首先,您需要在类中声明事件(以及方法和构造函数):

    public event EventHandler LabelsTextChanged;
    

    然后,您需要创建一种方法来处理各个标签的 TextChanged 事件。

    private void HandleLabelTextChanged(object sender, EventArgs e)
    {
        // we'll explain this in a minute
        this.OnLabelsTextChanged(EventArgs.Empty);
    }
    

    在某个地方,可能在控件的构造函数中,您需要订阅标签的 TextChanged 事件。

    myLabel1.TextChanged += this.HandleLabelTextChanged;
    myLabel2.TextChanged += this.HandleLabelTextChanged;
    myLabel3.TextChanged += this.HandleLabelTextChanged;
    

    现在为 HandleLabelsTextChanged 方法.我们可以养 LabelsTextChanged 直; 但是,.NET框架设计指南指出,创建 OnEventName是最佳实践 受保护的虚拟方法来为我们引发事件.这样,继承类可以通过覆盖 OnEventName来"处理"事件 方法,结果比订阅事件要好一些.即使您认为您永远也不会超越 OnEventName 方法,无论如何都要养成习惯,因为这可以简化事件的产生过程。

    这是我们的 OnLabelsTextChanged

    protected virtual void OnLabelsTextChanged(EventArgs e)
    {
        EventHandler handler = this.LabelsTextChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    

    我们必须检查是否为空,因为没有订阅者的事件为空.如果我们尝试引发null事件,则会得到一个 NullReferenceException .请注意,我们复制了事件的 EventHandler 在检查它是否为null并引发事件之前将其转换为局部变量.如果我们改为这样做:

    if (this.LabelsTextChanged != null)
    {
        this.LabelsTextChanged(this, e);
    }
    

    我们将在无效检查和事件引发之间有一个竞争条件.如果恰好发生在事件引发之前,但在我们检查为空之后,事件的订阅者取消了订阅,则将引发异常.您通常不会遇到此问题,但是最好养成以安全方式编写它的习惯。

    Edit: 这就是 public event EventHandler LabelsTextChanged; 行应放置:

    namespace YourNamespace
    {
        class MyUserControl : UserControl
        {
            // it needs to be here:
            public event EventHandler LabelsTextChanged;
            ...
        }
    }
    

    以下是事件设计的框架设计指南,供您进一步阅读。

  • 2021-1-12
    2 #

    首先,应在用户控件中声明一个事件,例如:

    public event EventHandler TextOfLabelChanged;
    

    然后,您必须在运行时调用绑定到事件(如果有)的回调函数。您可以通过处理标签的TextChanged事件来做到这一点:

    public void LabelTextChanged(object sender,EventArgs e)
    {
    if(TextOfLabelChanged!=null)
    TextOfLabelChanged(sender,e);
    }
    

    如果愿意,您可以拥有自己的EventArgs对象。

    在代码中的某个位置,应将标签TextChanged事件绑定到此方法,如下所示:

    _myLabel.TextChanged+=LabelTextChanged;
    

  • 2021-1-12
    3 #

    编译错误,它在第二行显示:"预期的类,委托,枚举,接口或结构"似乎与"事件..."有关。


    这两行必须在类声明的内部。

    public delegate void TextChangedEventHandler(object sender, EventArgs e);
    public event TextChangedEventHandler LabelTextChanged;
    

  • 2021-1-12
    4 #

    有一种非常简单的方法!

    在UserControl表单上:

    将属性更改为公开以在任何地方访问

    在使用UserControl的主窗体上:

    .5:在 using中 区域添加 using userControl1=UserControl.userControl1

    1。将" Laod"事件添加到您的UserControl中:

    this.userControl1.Load += new System.EventHandler(this.userControl1_Load);
    

    2。在userControl1_Load中:

    private void userControl1_Load(object sender, EventArgs e)
    {
         (sender as UserControl1).label1.TextChanged += label1_TextChanged; 
         //add a 'TextChanged' event to the label1 of UserControl1 
         OR use direct cast:
         ((UserControl1) sender).label1.TextChanged += label1_TextChanged;
    }
    

    3。在label1_TextChanged中:

    private void label1_TextChanged(object sender, EventArgs e)
     {
         //do whatever you want
     }
    

  • 2021-1-12
    5 #

    public delegate void TextChangedEventHandler(object sender, EventArgs e);
    public event TextChangedEventHandler LabelTextChanged;
    // ...
    protected void MyTextBox_TextChanged(object sender, EventArgs e)
    {
        if (LabelTextChanged != null) {
            LabelTextChanged(this, e);
        }
    }
    

  • javascript:检查嵌套对象中是否存在对象成员
  • html:为什么隐藏的溢出会阻止浮动元素逃离其容器?