0

我有一個列表框和一個用戶控件放置一個更新面板內這樣的頁面:刷新UpdatePanel的一個modalpopup內的用戶控件內按鈕的點擊事件發生後

<%@ 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> 

用戶控件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(); 
    } 
} 

一切正常,彈出所示,從頁面調用函數傳遞給用戶控件,如果用戶按下OK,正確觸發等觸發它,但在最後的函數DeleteItem()對頁面所做的更改(在本例中,從列表框中刪除的項目和啓動的通知消息)不起作用。

它就像updatepanel不刷新。我不能手動調用UpdatePanel1.Update(),因爲我一直有updatemode。理論上在頁面的這一部分,它應該刷新頁面的變化...

我試圖添加用戶控件頁面加載OK按鈕作爲UpdatePanel的PostBackTrigger沒有用和作爲AsyncPostBackTrigger。

請記住,這是頁面的削減版本,並且用戶控制,使人們可以專注於手頭的問題,所以如果你需要任何更多的細節問我...

的代碼流像這樣:

  1. 用戶點擊刪除項目按鈕,並在頁面(第一回發)觸發 btnDelete_Click()

  2. btnDelete_Click()調用的用戶控件的CMessage。MessageConfirm傳遞DeleteItem作爲 參數

  3. 在用戶控件MessageConfirm()表示modalpopup並且爲了節省 參數函數DeleteItem()以後稱之爲( 第一個回發的端)

  4. 顯示後modalpopup用戶單擊OK按鈕 觸發btnOk_Click()在該用戶控件(第二回發)

  5. 在用戶控件btnOk_Click()調用DeleteItem()函數 所保存上10狡猾

  6. 在頁面DeleteItem()從列表框刪除項目(可以說 我不調用所述第二消息,以簡化,這將是 端部的第二回發,和更新面板處理不當刷新:S )

我想我已經分離出的問題,感動了所有的控制和功能從用戶控件的頁面,問題依然存在,但如果我叫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}); 
     } 

爲什麼是這樣工作的請告訴我內部差異?

相關問題