如何覆盖UserControl上的事件

时间:2010-03-24 07:53:37

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

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

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

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

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

提前致谢,

5 个答案:

答案 0 :(得分:3)

如果您的用户控件是从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#创建的,只需重定向usercontrol文本框的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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

失败了,启动你的调试器,然后进行探险。寻找上述事件和/或函数,然后通过一些反思来调用或挂钩它们。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以提供一些控制器来执行此类操作。

[注意:这是伪代码,验证textchanged的eventhandler]


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)
  }
}