0

У меня есть страница с 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.

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

Поток кода как это:

  1. Пользователь нажимает на кнопку удаления элемента и инициирует btnDelete_Click() в страницы (первый постбэка)

  2. btnDelete_Click() вызывает UserControl CMessage.MessageConfirm прохождение DeleteItem в качестве аргумента

  3. В UserControl MessageConfirm() показывает modalpopup и сохраняет аргумент функции DeleteItem() для того, чтобы назвать его позже (конец первого постбэка)

  4. После отображения modalpopup пользователь нажимает ее, кнопку ОК и запускает btnOk_Click() в UserControl (второй обратной передачи)

  5. в UserControl btnOk_Click() вызывает функцию DeleteItem(), который был сохранен Previou хитрая

  6. На странице 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? 
    } 

Есть ли какая-то несовместимость с делегатами?

ответ

0

В конце концов я решил, что изменения следующие строки:

if (FunctionButtonPressedOk!= null) 
     { 
      //FunctionButtonPressedOk(); 
      Page.GetType().InvokeMember(FunctionButtonPressedOk.Method.Name, BindingFlags.InvokeMethod, null, Page, new []{sender, e}); 
     } 

Почему это работает так Что разница внутри?

Смежные вопросы