【问题标题】:How to override event on a UserControl如何覆盖用户控件上的事件
【发布时间】:2010-03-24 07:53:37
【问题描述】:

我有一个带有一些 UserControl 的 WinForms 应用程序 (OwnerForm)。

当 UserControl 的文本框发生变化时,我想过滤 OwnerForm 的内容。

但是我该怎么做呢?我不想在用户控件中指定 OwnerForm。

我知道一种将 MyUserControl.tb.TextChanged 的​​手动处理程序添加到所有者表单上的某些函数的解决方案,但我认为这是不好的方法。我更喜欢拥有可覆盖的功能,但我无法想象如何做到这一点。有什么建议吗?

提前致谢,

【问题讨论】:

    标签: .net vb.net winforms user-controls overriding


    【解决方案1】:

    如果您的用户控件是由 VB.NET 制作的,请执行此操作,必须处理该事件并将其重新提交给您的控件的使用者:

    Public Class FilterBox
    
        <Browsable(True)> _
        Public Shadows Event TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    
    
        Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    
            RaiseEvent TextChanged(sender, e)
    
        End Sub
    
    End Class
    

    如果您的用户控件是由 C# 制作的,请执行此操作,只需重定向用户控件文本框的 TextChanged 事件:

    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    
    namespace Craft
    {
    
        public partial class FilterBox : UserControl
        {
            public FilterBox()
            {
                InitializeComponent();            
            }
    
            [Browsable(true)]
            public new event EventHandler TextChanged
            {
                add
                {
                    textBox1.TextChanged += value;
                }
                remove
                {
                    textBox1.TextChanged -= value;
                }
            }//TextChanged "surfacer" :-)
    
        }//FilterBox
    }//Craft
    

    消费方面,VB.NET 的 FilterBox 和 C# 的 Filterbox 是相同的。但是C#中的实现更直接,它只是将消费者程序员的事件直接插入到usercontrol的textbox1的事件中。

    我觉得Defining Add and Remove Accessor Methods for Events in VB.NET的文章标题应该是:想成为所有VB朋友的羡慕对象

    从上面的实现代码可以看出,C# 的运行时开销较小。

    上面的 C# 代码在 VB.NET 中是不可能的:One might ask "why should I care?" Well, C# permits programmers to define their own add and remove subscription events. As a result a C# developer can extend the behavior of the add and remove subscription methods. One useful application of the add and remove handler is to surface an event on a constituent control

    注意:使用用户控件的文本框的更改事件。在VS设计器中,点击属性工具箱,点击事件(闪电)图标,双击TextChanged,添加必要的逻辑。

    【讨论】:

      【解决方案2】:

      在 UserControl 中创建一个 FilterChanged 事件,该事件将在内部 TextBox 的 TextChanged 事件中引发。然后你就会很好地封装它。

      【讨论】:

      • 如果我在 UserControl 中创建了这样的子:Public Overridable Sub FilterParentForm() End Sub 如何在 OwnerForm 中覆盖它?我想写类似 Public Overrides Sub UserControl.FilterParentForm End Sub 但我不能。
      • 如果您的 OwnerForm 继承了 UserControl,您可以覆盖 sub。仅在继承上下文中覆盖工作。如果您将用户控件拖到所有者窗体,则您的用户控件中必须有一个可分配的事件并将处理程序添加到该事件,就像程序中的任何其他控件一样,例如TextChanged、KeyPress、Click 等
      【解决方案3】:

      覆盖(扩展)控件。查看是否可以将事件处理程序连接到文本框的 Changed 事件。如果找不到这样的事件,请检查它是否具有可以覆盖的 OnTextChanged 函数(它的名称可能不同,但大多数控件编写者遵循的约定是使 On* 函数虚拟化,以便扩展的人控件可以覆盖它)。

      如果这一切都失败了,请启动您的调试器,然后开始探索。寻找上述事件和/或函数,然后通过一些反射来调用或挂钩它们。

      【讨论】:

        【解决方案4】:

        只有在扩展 TextBox 时才能覆盖。因此,您可能应该在进行过滤的文本框(文本更改)中注册一个处理程序。

        【讨论】:

        • 你能给我任何例子或解释的链接吗?
        【解决方案5】:

        你可以提供一些控制器来做这些操作。

        [注意:这是伪代码,请验证 textchanged 的​​事件处理程序]

        public interface IOperationController { bool DataChanged(string newData,string oldData); } public class YourControl:UserControl { private IOperationController_controller; public void SetController(IOperationControllercontroller) { _operationController = controller; } private void OnTextChanged(object sender, TextChangedEventArgs e) { if(_operationController != null && _operationController.DataChanged(e.Value,textBox.Text)) { //perform your operation } } } public class OwnerForm:Form,IOperationController { public OwnerForm() { yourControlInstance.SetController(this) } }

        【讨论】:

          猜你喜欢
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多