我有一个带有UserControl的WinForms应用程序(OwnerForm)。
当UserControl的文本框发生变化时,我想过滤OwnerForm的内容。
但我怎么能做到呢?我不想在用户控件中指定OwnerForm。
我知道将MyUserControl.tb.TextChanged的手动处理程序添加到所有者表单上的某些函数的解决方案,但我认为这是不好的方法。我更喜欢有可覆盖的功能,但我无法想象如何做到这一点。有什么建议吗?
提前致谢,
答案 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#的运行时开销较少。
注意:使用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)
}
}