【问题标题】:expose and raise event of a child control in a usercontrol in c#在 c# 中的用户控件中公开和引发子控件的事件
【发布时间】:2010-10-30 21:36:20
【问题描述】:

嗨。我有一个包含文本框的 UserControl。我想访问文本框的 textchanged 事件,但在用户控件的事件属性中,我看不到文本框的事件。如何使用 C# 在 Winforms 中公开公开的 UserControl 公开和处理子控件的特定事件。

【问题讨论】:

    标签: c# winforms user-controls childcontrol


    【解决方案1】:

    如果愿意,您可以显示新事件并将任何订阅直接传递给控件:

    public class UserControl1 : UserControl 
    {
        // private Button saveButton;
    
        public event EventHandler SaveButtonClick
        {
            add { saveButton.Click += value; }
            remove { saveButton.Click -= value; }
        }
    }
    

    【讨论】:

    • 太棒了!我做了类似的事情,通过显式添加一个事件处理程序,因为我通过用户控件公开了子控件。您的建议是更简洁的方法!谢谢!
    • 尽管它很优雅,但这个解决方案有一个主要缺点:传递给处理程序的 sender 参数将是 Button,而不是 UserControl... 这使得无法在多个处理程序中使用相同的处理程序控件的实例
    • 还有什么可以做的吗?不知何故,以声明方式添加的事件处理程序不起作用
    • 如果您将按钮而不是 UserControl 作为参数,则可能您可以让父级然后告诉事件来自哪个父级用户控件...我真的不知道,只是猜测。 ..也许你必须正确编码用户控件才能做到这一点。
    【解决方案2】:

    将整个 TextBox 公开为用户控件中的公共属性,并以您希望的方式订阅它的事件。
    示例:

    class myUserControl: UserControl { 
    private TextBox _myText;
    public TextBox MyText { get {return _myText; } }
    

    }

    完成此操作后,您可以像这样订阅它的任何事件:

    theUserControl.MyText.WhatEverEvent += ... 
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,到目前为止我也做过类似的事情。正在寻找上面提供的优雅解决方案。感谢您的帮助。+1
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多