【问题标题】:How to extend control events IExtenderProvider?如何扩展控制事件 IExtenderProvider?
【发布时间】:2011-10-28 01:23:33
【问题描述】:

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

【问题讨论】:

    标签: c# events components extend iextenderprovider


    【解决方案1】:

    SetErrorText 方法是您的关键。您需要保留具有错误文本的控件的 List。当控件不在列表中时,您将控件添加到 SetErrorText 中的列表中。并订阅其 Validating 事件。当 value 参数为 null 或为空时,您将其从列表中删除。并取消订阅该活动。这在 IExtenderProvider 的 MSDN 库文章中得到了很好的解释,请检查那里给出的示例中的 SetHelpText() 方法的代码。

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

    【讨论】:

    • 如果没有给出错误提供者或错误文本,则什么也不会发生。这就是我想要的方式。 SetErrorText 只是分配 errortext,而不是立即创建 errorprovider 条目。经过一些谷歌搜索后我发现,扩展事件是不可能的。我现在只是在 Control.Leave 事件中调用方法(显示/隐藏)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多