如何扩展控件事件IExtenderProvider?

时间:2011-08-16 12:58:43

标签: c# events components extend iextenderprovider

有没有办法向控件添加事件,比如使用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
            //--------------------------
        }
    }
}

1 个答案:

答案 0 :(得分:1)

SetErrorText方法是你的关键。你需要保留一个List<>您有错误文本的控件。将控件添加到SetErrorText中的列表时,它不在列表中。并订阅其Validating事件。当参数为null或为空时,将其从列表中删除。并取消订阅该活动。在IDNtenderProvider的MSDN Library文章中对此进行了详细解释,请在此处给出的示例中检查SetHelpText()方法的代码。

执行此操作时出现问题,控件可以设置错误文本,但不能设置ErrorProvider。或者相反,两者都不好。最好将您自己的ErrorProvider保留为您的类的私有成员,或通过属性分配。一个就够了。