У меня есть страница с ListBox и пользовательский элемент управления размещается внутри панели обновления, как это:Освежающий UpdatePanel после события нажатия кнопки внутри modalpopup внутри UserControl
<%@ Register TagPrefix="uc1" TagName="CMessage" Src="~/Controls/CMessage.ascx" %>
<ajaxToolkit:ToolkitScriptManager runat="server" ID="ToolkitScriptManager1" EnableScriptGlobalization="true" EnableScriptLocalization="true" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:ListBox ID="lbox" runat="server"></asp:ListBox>
<asp:Button ID="btnDelete" OnClick="btnDelete_Click" runat="server" Text="Delete selected item" Enabled="True"></asp:Button>
<uc1:CMessage ID="CMessage1" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
страница отделенного кода, как это:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
lbox.Items.Add("test1");
lbox.Items.Add("test2");
}
}
protected void btnDelete_Click(object sender, EventArgs e)
{
CMessage.MessageConfirm("Delete item?", "Yes", "No", DeleteItem);
}
protected void DeleteItem()
{
lbox.Items.Remove(lbox.SelectedItem);
CMessage.Message("Item deleted succesfully!");
}
пользовательский элемент управления, как это:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CMessage.ascx.cs" Inherits="Controles.CMessage" %>
<table id="tableMessage" runat="server" style="display: none" class="modalPopup">
<tr>
<td>
<asp:Label ID="lb5" runat="server" Text="Message"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lbMessage" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Button ID="btnOk" runat="server" Text="Ok" OnClick="btnOk_Click" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClick="btnCancel_Click" />
</td>
</tr>
</table>
<asp:Button ID="btnOKError" runat="server" Text="OK" style="display: none" />
<ajaxToolkit:ModalPopupExtender ID="ModalPopupMessage" runat="server" TargetControlID="btnOKError" PopupControlID="tableMessage" OkControlID="btnOKError" CancelControlID="btnOKError"></ajaxToolkit:ModalPopupExtender>
UserControl codebehi ой, как это:
public partial class CMensaje : UserControl
{
public delegate void FunctionButtonPressed();
private FunctionButtonPressed FunctionButtonPressedOk
{
get { return (FunctionButtonPressed)Session["FunctionButtonPressedOk"]; }
set { Session["FunctionButtonPressedOk"]= value; }
}
protected void btnOk_Click(object sender, EventArgs e)
{
ModalPopupMenssage.Hide();
if (FunctionButtonPressedOk!= null)
{
FunctionButtonPressedOk();
}
}
protected void btnCancel_Click(object sender, EventArgs e)
{
ModalPopupMessage.Hide();
}
public void Mensaje(string message)
{
lbMessage.Text = message;
FunctionButtonPressedOk= null;
btnCancel.Visible = false;
ModalPopupMessage.Show();
}
public void MessageConfirm(string message, FunctionButtonPressed FunButtonOkx)
{
lbMessage.Text = message;
FunctionButtonPressedOk= FunBotonAceptarx;
btnCancel.Visible = true;
ModalPopupMensaje.Show();
}
}
Все работает, всплывающее окно отображается, функция для вызова со страницы передается в UserControl, чтобы вызвать его, если пользователь нажимает ОК и триггеры правильно и т.д. Но в этой последней функции DeleteItem() изменения, сделанные на странице (в этом примере элемент, удаленный из списка и запущенное уведомление) не работает.
Его как обновленная панель не обновляет. Я не могу вызвать вручную UpdatePanel1.Update(), потому что у меня есть updatemode, как всегда. Теоретически в этой части pagecycle он должен обновлять страницы с изменениями ...
Я попытался добавить в пользовательский элемент управления кнопку OK в качестве PostBackTrigger из UpdatePanel без каких-либо изменений и как AsyncPostBackTrigger.
Имейте в виду, что это похудел версия страницы и пользовательский элемент управления, чтобы люди могли сосредоточиться на проблеме под рукой, так что если вам нужно больше деталей спросите меня ...
Поток кода как это:
Пользователь нажимает на кнопку удаления элемента и инициирует btnDelete_Click() в страницы (первый постбэка)
btnDelete_Click() вызывает UserControl CMessage.MessageConfirm прохождение DeleteItem в качестве аргумента
В UserControl MessageConfirm() показывает modalpopup и сохраняет аргумент функции DeleteItem() для того, чтобы назвать его позже (конец первого постбэка)
После отображения modalpopup пользователь нажимает ее, кнопку ОК и запускает btnOk_Click() в UserControl (второй обратной передачи)
в UserControl btnOk_Click() вызывает функцию DeleteItem(), который был сохранен Previou хитрая
На странице DeleteItem() удаляет элемент из ListBox (позволяет сказать я не называю второе сообщение для упрощения, это будет конец второй постбэк и hasnt обновление панели обновилась: S)
Я думаю, что я изолировал проблему, перемещать все элементы управления и функции от UserControl на страницу, проблема сохраняется, но если я назвал функцию DeleteItem() непосредственно вместо своего делегата он работал (имейте в виду, что в обоих случаях точка останова при DeleteItem() срабатывала так, чтобы функциональный код выполнялся правильно):
protected void btnOk_Click(object sender, EventArgs e)
{
ModalPopupMenssage.Hide();
/*if (FunctionButtonPressedOk!= null)
{
FunctionButtonPressedOk();
}*/
DeleteItem(); //page updates correctly! why?
}
Есть ли какая-то несовместимость с делегатами?