у нас есть UserControl для обработки аннулирования пользователя, который используется в нескольких местах. У этого есть пара полей ввода и кнопка отправки. Когда они отправляют статус пользователя, обновляется, и выполняется несколько других действий, и отображается сообщение с обратной связью.
На одной из страниц, которая включает элемент управления, после того, как Пользователь успешно отменил их отправку через UserControl, нам нужно, чтобы страница была уведомлена каким-то образом, чтобы она могла вызвать один из своих методов и обновить ее отображение [в этом случае Статус пользователя, который был посещен и теперь отменен].
Как мы связываем их? Я бы предположил, что с участием делегатов и обработчиков событий, но у них нет большого опыта работы с ними, поэтому не знаю, поеду ли я по тупику...
Одно очень хакерское решение было бы для UserControl вызывать перенаправление, а затем контролировать страницу сеанса или параметр строки запроса и т.д., но просто набрав его, я сделал дрожь, поэтому было бы очень последней инстанции.
Если вам нужна дополнительная информация, пожалуйста, спросите, и я предоставлю ее.
Это должно быть довольно легко. Добавьте событие 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
}
Я думаю, что ваши инстинкты верны. Это можно решить, указав пользовательское событие и делегат. Что-то в этом направлении должно выполняться:
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
}
}
Самый простой способ - создать событие в UserControl, чтобы сигнализировать о том, что произошло отмена. Добавьте обработчик для этого в исходную форму и обновите отображение при его запуске.
Если ваша форма является классом вашего собственного дизайна, например
public class MyForm : Form
{
public void MyCustomRefresh()
{
}
}
Затем, в пользовательском элементе управления, я бы предположил, что он используется в нескольких формах, чтобы разрешить протоколирование отмены, как вы описали... Затем, в конце вашего кода любой кнопки события/вы могли бы сделать что-то вроде
((MyForm)this.FindForm()).MyCustomRefresh()
Таким образом, вы можете использовать "this.FindForm()", чтобы получить форму, тип-приведение в свое пользовательское определение формы, которое вы ЗНАЕТЕ, имеет такой метод "MyCustomRefresh()" и вызываете его напрямую. Никаких делегатов не требуется.