有没有一种方法可以向控件添加事件,就像使用IExtenderProvider向控件添加属性一样?
我试着写一个自己的验证器和一个errorpovider。使用IExtenderProvider,我向控件添加了errorprovider和errortext。现在我需要从我的扩展类中触发一个事件。
代码片段:
[ProvideProperty("ErrorText", typeof(TextBox))]
[ProvideProperty("ErrorProvider", typeof(TextBox))]
class ValidatorExtender : Component, IExtenderProvider {
public bool CanExtend(object extendee) {
return extendee is TextBox;
}
[DefaultValue(""), Category("Data")]
public string GetErrorText(Control control) {
//---------------------------
//Return the ErrorText
//---------------------------
}
}
public void SetErrorText(Control control, string value) {
//---------------------------
//Assigning the ErrorText
//---------------------------
}
[DefaultValue(null), Category("Data")]
public ErrorProviderEX GetErrorProvider(Control control) {
//---------------------------
//Return the ErrorProvider
//---------------------------
}
public void SetErrorProvider(Control control, ErrorProviderEX value) {
//---------------------------
//Assigning the ErrorProvider
//---------------------------
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
public event ValidatingHandler Validating; // -> The event I want to add to the Controls
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void Control_Leave(object sender, EventArgs e) {
if(Validating != null){
Validating(this, new ValidatingEventArgs());
//--------------------------
// Assign Error if necessary
//--------------------------
}
}
}发布于 2011-08-16 21:50:00
SetErrorText方法是您的关键。您需要保留一个包含错误文本的控件的List<>。当该控件不在列表中时,可以在SetErrorText中将该控件添加到列表中。并订阅其验证事件。当value参数为null或为空时,将其从列表中删除。并取消订阅该事件。这在IExtenderProvider的MSDN Library文章中有很好的解释,请检查示例中的SetHelpText()方法的代码。
你这样做的方式有一个问题,一个控件可以设置错误文本,但不能设置ErrorProvider。或者反过来,两者都不好。最好将您自己的ErrorProvider保留为类的私有成员,或通过属性进行赋值。一个就足够了。
https://stackoverflow.com/questions/7078550
复制相似问题