Предоставление событий из пользовательских контроллеров asp.net на странице контейнера веб-форм - PullRequest
1 голос
/ 08 сентября 2011

Как на самом деле представить абстрактное событие из asp.net usercontrol [ascx file] на страницу веб-формы контейнера. Это мой сценарий,

  1. Я создал пользовательский веб-формы, управляющий файлом ascx, и поместил контрольный список с привязкой к данным с валидатором, чтобы проверить его (я знаю, что это можно сделать самими веб-формами, почему пользователь спрашивает, но это сценарий)

  2. Теперь я хотел представить на странице контейнера событие с именем OnValidating, которое выдаст результат проверки

Подпись события ниже:

public delegate void Validating(object source,EventArgs e);

public event Validating OnValidating;

public void InvokeOnValidating(EventArgs e)
        {
            Validating handler = OnValidating;
            if (handler != null) handler(this, e);
        }

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

  1. Мне не удалось отобразить событие в окне свойств, когда все другие публичные свойства сделали

  2. Почему, черт возьми, мои event invoker[InvokeOnValidating], event delegate[Validating] отображаются в списке intellisense, когда я набираю usercontrolid. вместе с event[OnValidating]. Я хочу, чтобы было выставлено только событие.

  3. Также я могу разрешить странице подписаться на событие TextboxChanged, созданное внутри usercontrol? Если это так, получите мне код.

Примечание: я хотел бы видеть больше кода, чем длинных объяснений

1 Ответ

5 голосов
/ 08 сентября 2011

Вы смешиваете понятия, вам не нужен делегат для регистрации событий, попробуйте этот код, и я объясню изменения и постараюсь ответить на ваши вопросы ниже

    public event EventHandler Validating;
    private void OnValidating(EventArgs ea)
    {
        var e = Validating;
        if (e != null)
            e(this, ea);
    }

На странице с использованием элемента управления обратите внимание на На , платформа добавляет это для всех событий:

<uc:MyUserControl OnValidating="myhandlermethodinpage" />
  1. VS не является на 100% точным, иногда свойства элементов управления не отображаются! Intelissence надежнее
  2. Поскольку они не были определены как частные, только событие должно быть открытым.
  3. Не уверен, что это будет возможно, вам нужно захватить событие текстового поля в элементе управления и заставить его вызвать свое новое событие.

Не удалось добавить комментарий, но в основном, если вам нужны настраиваемые аргументы событий, сделайте так:

    public event EventHandler<CustomEventArgs> Validating;
private void OnValidating(CustomEventArgs ea)
{
    var e = Validating;
    if (e != null)
        e(this, ea);
}
public class CustomEventArgs:EventArgs{
    public int MyProperty { get; set; }
}
...