Как продлить события управления IExtenderProvider?
Есть ли способ добавить события в элемент управления, такие как добавление свойств в элемент управления с помощью IExtenderProvider?
Я пытаюсь написать собственный валидатор с errorpovider. с IExtenderProvider я добавляю errorprovider и текст ошибки к элементу управления. теперь мне нужно запустить событие из моего класса extender.
Snippet:
[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 ответ
Метод SetErrorText - это ваш ключ. Вам нужно сохранить список<> элементов управления, для которых у вас есть текст ошибки. Вы добавляете элемент управления в список в SetErrorText, когда его еще нет в списке. И подпишитесь на свое Валидирующее событие. Вы удаляете его из списка, когда значение аргумента равно нулю или пусто. И отписаться на событие. Это хорошо объяснено в статье библиотеки MSDN для IExtenderProvider, проверьте код для метода SetHelpText() в приведенном там примере.
Существует проблема в том, как вы это делаете, элемент управления может установить текст ошибки, но не ErrorProvider. Или наоборот, ни хорошо. Лучше всего оставить свой собственный ErrorProvider в качестве частного члена вашего класса или назначить его через свойство. Одного достаточно.