Переопределенное событие не вызывается в пользовательском элементе управления - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть пользовательский элемент управления с TextBox на нем:

public partial class MyControl : UserControl
{
    public new event CancelEventHandler Validating
    {
        add
        {
            txt.Validating += value;
        }
        remove
        {
            txt.Validating -= value;
        }
    }

    public new string Text
    {
        get => txt.Text;
        set => txt.Text = value;
    }
}

Я помещаю элемент управления и ErrorProvider на форму и выполняю следующие действия:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        SetErrorEvents(myControl1);
    }

    private void SetErrorEvents(object control)
    {
        (control as Control).Validating += ValidationEvent;
    }

    private void ValidationEvent(object sender, CancelEventArgs e)
    {
        var control = (Control)sender;

        if (string.IsNullOrWhiteSpace(control.Text))
            errorProvider1.SetError(control, "error");
        else
            errorProvider1.SetError(control, string.Empty);
    }
}

При настройке делегата для события Validating моего элемента управления он устанавливает делегат для самого UserControl и не переопределяется так, чтобы было установлено событие TextBox.

Не должнонад работой как есть?Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Не переопределяется, скрывается или скрывается ключевым словом new.Вы не подписались на новое событие, вы подписались на событие базового класса.Это в основном, как полиморфизм работает.

  • Если вы хотите вызвать событие Validating пользовательского элемента управления при проверке дочернего элемента управления, обработайте событие Validating дочернего элемента управления и вызовите метод OnValidating методапользовательский контроль.

  • Если вы хотите переопределить метод Validating переопределения события OnValidating.

  • Если вы хотите изменить отправителя Validating событие, вам нужно изменить способ вызова события Validating.Для этого вам нужно использовать отражение и найти событие и напрямую вызвать его самостоятельно.

Пример - Возбуждение события валидации UserControl, когда дочерний элемент управления проверяет

Если вы хотите вызвать Validating событие вашего элемента управления при проверке дочернего текстового поля, обработайте Validating событие дочернего элемента управления и вызовите ``

public MyControl()
{
    InitializeComponent();
    txt.Validating += (obj, args) => OnValidating(args);
}

Пример - событие переопределения проверки

protected override void OnValidating(CancelEventArgs e)
{       
    // Add custom code here.       
    base.OnValidating(e);
}

Пример - Возбуждение события Validating вручную без вызова base.OnValidating

Если по какой-то причине вы этого не сделаетехотите вызвать base.OnValidating, в то время как его ответственность в основном заключается в создании события Validating, вы можете найти событие и вызвать его напрямую:

protected override void OnValidating(CancelEventArgs e)
{  
    var f = typeof(Control).GetField("EventValidating",
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Static);
    var validating = (CancelEventHandler)Events[f.GetValue(this)];
    validating?.Invoke(this, e); 
}

Сделав это, например, вы можете установить другого отправителя, такого какдочерний контроль вместо this.

0 голосов
/ 10 февраля 2019

Определите этот интерфейс:

public interface IMyControl
{
    event CancelEventHandler Validating;
}

Примените интерфейс к вашим индивидуальным элементам управления:

public partial class MyControl : UserControl, IMyControl
{
    ...
}

В вашем классе Form обновите SetErrorEvents(), чтобы привести его к IMyControl вместо:

...
private void SetErrorEvents(object control)
{
    (control as IMyControl).Validating += ValidationEvent;
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...