Как узнать, когда UserControl завершил запуск события?

2

у нас есть UserControl для обработки аннулирования пользователя, который используется в нескольких местах. У этого есть пара полей ввода и кнопка отправки. Когда они отправляют статус пользователя, обновляется, и выполняется несколько других действий, и отображается сообщение с обратной связью.

На одной из страниц, которая включает элемент управления, после того, как Пользователь успешно отменил их отправку через UserControl, нам нужно, чтобы страница была уведомлена каким-то образом, чтобы она могла вызвать один из своих методов и обновить ее отображение [в этом случае Статус пользователя, который был посещен и теперь отменен].

Как мы связываем их? Я бы предположил, что с участием делегатов и обработчиков событий, но у них нет большого опыта работы с ними, поэтому не знаю, поеду ли я по тупику...

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

Если вам нужна дополнительная информация, пожалуйста, спросите, и я предоставлю ее.

  • 0
    Поскольку вы говорите «строковый параметр» и «страница», я предполагаю, что вы говорите о веб-формах, а не о winforms.
  • 1
    Я переключился на ASP.Net, как вы упомянули перенаправление на страницы. Если я ошибаюсь, и это - winforms, не стесняйтесь поправлять меня.
Показать ещё 3 комментария
Теги:
delegates
user-controls
event-handling

4 ответа

2
Лучший ответ

Это должно быть довольно легко. Добавьте событие Delegate в свой UserControl следующим образом:

public event EventHandler UserCancelled;

Затем в вашем пользовательском элементе управления в конце метода отмены просто вызовите делегата:

if (this.UserCancelled!= null)
{
   this.UserCancelled(this, new EventArgs());
}

Затем просто добавьте обработчик события в свою разметку aspx для пользовательского управления:

OnUserCancelled="UserControl1_UserCancelled"

И, наконец, добавьте обработчик на свою страницу:

protected void UserControl1_UserCancelled(object sender, EventArgs e)
{
    // Your code
}
  • 0
    Просто чтобы добавить их без редактирования, вам не нужно помещать часть «if (this.UserCancelled! = Null)», если вы всегда используете событие. Если вы не всегда хотите захватить событие, то обеспечение того, что делегат не является нулевым, предотвращает его возникновение.
1

Я думаю, что ваши инстинкты верны. Это можно решить, указав пользовательское событие и делегат. Что-то в этом направлении должно выполняться:

public delegate void CancelledUserHandler();

public partial class UserCancellationControl : System.Web.UI.UserControl
{
    public event CancelledUserHandler UserCancelled;

    protected void CancelButtonClicked(object sender, EventArgs e)
    {
        // process the user cancellation

        // fire off an event notifying listeners that a user was cancelled
        if (UserCancelled != null)
        {
            UserCancelled();
        }
    } 
}

public partial class MyPage : System.Web.UI.Page
{
    protected UserCancellationControl myControl;

    protected void Page_Load(object sender, EventArgs e)
    {
        // hook up the ProcessCancelledUser method on this page
        // to respond to cancellation events from the user control
        myControl.UserCancelled += ProcessCancelledUser;
    }

    protected void ProcessCancelledUser()
    {
        // update the users status on the page
    }
}
  • 0
    Это был отличный ответ, но он был побежден ответом GenericTypeTea.
  • 0
    Хех, мне нравилось наблюдать за репутацией пинг-понга между мной и Кайлом. Спасибо за то, что приняли мой ответ в конце.
Показать ещё 1 комментарий
0

Самый простой способ - создать событие в UserControl, чтобы сигнализировать о том, что произошло отмена. Добавьте обработчик для этого в исходную форму и обновите отображение при его запуске.

-1

Если ваша форма является классом вашего собственного дизайна, например

public class MyForm : Form
{
   public void MyCustomRefresh()
   {
   }
}

Затем, в пользовательском элементе управления, я бы предположил, что он используется в нескольких формах, чтобы разрешить протоколирование отмены, как вы описали... Затем, в конце вашего кода любой кнопки события/вы могли бы сделать что-то вроде

((MyForm)this.FindForm()).MyCustomRefresh()

Таким образом, вы можете использовать "this.FindForm()", чтобы получить форму, тип-приведение в свое пользовательское определение формы, которое вы ЗНАЕТЕ, имеет такой метод "MyCustomRefresh()" и вызываете его напрямую. Никаких делегатов не требуется.

  • 0
    Он использует ASP.Net.
  • 0
    Да, извините за путаницу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню