簡體   English   中英

如何從子頁面觸發更新面板回發?

[英]How do I trigger an update panel postback from a child page?

我在gridview中的每一行的單元格中都有一個更新面板。 用戶單擊此更新面板上的鏈接按鈕以顯示(使用window.open())彈出窗口。 在該彈出窗口中采取措施來更新上述更新面板中包含的數據。 我只想在關閉彈出窗口時觸發該更新面板的更新。

做這個的最好方式是什么? 我正在研究捕獲window.close事件,並以某種方式傳遞一個值,該值指示從何處調用彈出窗口,然后在javascript中為該更新面板調用回發。 如果有什么不同(至少會-在我的JavaScript代碼中會這樣),我使用的是母版頁,並且僅針對IE進行編碼。

發現了這一點: http : //forums.asp.net/p/1166328/1941797.aspx ,它使用window.opener.document ...再次,使用母版頁會使事情變得復雜。

您可以使用javascript函數__doPostBack('eventTarget','eventArgument')。 在客戶端也許看起來像這樣。

function showPopup()
{
 var return = window.showModalDialog('someurl','','');
 if(return)
 {
  // do postback for update
  __doPostBack('<%= hiddenButton.ClientID %>','eventArgument');
 }
}

在服務器端,您應該使用Update Panel並帶有UpdateMode = Conditional和隱藏按鈕,如rick schott所說。 棘手的部分是知道需要更新哪個單元。 如果將OnClick鏈接為hiddenbutton,則在調用__doPostBack時將觸發該事件。 您可以從服務器端訪問Request.Form [“ __ EVENTARGUMENT”]以訪問__doPostBack發送的值。 例如,您可以使用此值進行操作,以更新需要更新的單元格。

我已經從Flash應用程序完成了此操作。 我的“ hack”方法是用CSS隱藏真正的ASP:Button。 該按鈕位於UpdatePanel內部。 我將Button.ClientId傳遞給外部資源(Flash,新窗口等)。 當外部資源(在我的情況下為Flash)完成時,它調用一個接受ClientId的JavaScript函數,並在按鈕上調用.Click()。

JavaScript的:

function CallASPNETClick(id) {  
    var elmt = document.getElementById(id);   
    elmt.click();

}

標記:

!--this is uses for capture an event from Flash with javascript, do not remove--->
<asp:Button ID="hiddenButton" runat="server" Text="Button" style="visibility:hidden" OnClick="hiddenButton_Click" />

您可以在調用頁面上使用隱藏字段來存儲回調所需的任何值。 彈出窗口可以使用window.opener將值存儲在這些隱藏字段中。

您可以展開window.open函數,以使用對調用者的引用來更新頁面上的javascript變量:

<asp:button onclientclick="buttonClicked(this)" />

var lastButton;
function buttonClicked(button) {
lastButton = button;
window.open(x);
return false;
}

如果您將隱藏字段設置為asp控件,則可以在更新面板的回發中訪問它們。

編輯:

考慮一個模式彈出窗口,以消除人們在期望他們使用彈出窗口時單擊呼叫頁面的問題。

我選擇的更簡單(且可行)的解決方案是使用gridview單元中用戶控件內的ModalPopupExtender來實現此目的。 用戶控件包含只讀結果網格和ModalPopupExtender。 彈出窗口允許您在父網格的單元格內編輯該網格的內容。 單擊添加按鈕后,小型網格將異步更新。

幾個關鍵項目終於使我找到了可行的解決方案...

  • 在更新面板中包裝PopupControlId屬性中引用的面板的內容
  • 在后面的代碼中隱藏和顯示模式彈出窗口
  • 一個使用多個ModalPopupExtenders的gridview的簡單示例

這兩種方式都對我有效

(1)通過從MasterPAge引用ChildPage

  ContentPlaceHolder_content.FindControl("dvwOrder").Controls.Clear(); ((UpdatePanel)this.ContentPlaceHolder_content.FindControl("upOrders")).Update(); 

這段代碼在母版頁中,然后在我的按鈕上單擊“我正在使用contentplaceholder在其中查找控件的引用”。 這里dvwOrder是我的DataView,“ upOrders”是我的UpdatePanel。

(2)通過代表

將此委托和事件處理程序放在任何方法之外的母版頁上

  public delegate void RefreshButtonClickHandler(object 

發送者,EventArgs e); 公共事件RefreshButtonClickHandler onRefreshButtonClick;

在類中,您的按鈕單擊事件中執行此操作

  if(null == onRefreshButtonClick) { return; } onRefreshButtonClick(sender, e); 

然后在子頁面的Page_Load方法中將此事件與本地處理程序聯系起來

  Child child = (child) this.Master; reports.onRefreshButtonClick += new 

子.RefreshButtonClickHandler(reports_onRefreshButtonClick);

這里的孩子是我的代碼隱藏文件的名稱

創造

    void child_onRefreshButtonClick(object sender, EventArgs e)
    {

    }

你完成了

我放棄了在單獨的窗口中執行此操作的精力,而是使用AJAX ModalPopupExtender開發了解決方案。 Matt Berseth的例子非常有幫助。

為了更新父網格內更新面板中包含的子網格,我將單擊按鈕的行的值存儲在會話變量中,然后在用戶完成操作后使用稱為子網格的databind方法的值他們的選擇並點擊保存。

protected void btnShowSkillsetPopup_Click(object sender, EventArgs e)
{
    // get the gridviewrow from the sender so we can get the datakey we need
    Button btnAddSkillsetsFromRow = sender as Button;
    GridViewRow row = (GridViewRow)btnAddSkillsetsFromRow.NamingContainer;

    Session["CapRes_ResourceRequestID"] = Convert.ToString(this.grdResources.DataKeys[row.RowIndex].Value);
    Session["CapRes_SkillsetUpdatePanel_Row"] = Convert.ToString(row.RowIndex);
    ModalPopupExtender.Show();
}

保存代碼...

int nUpdatePanelID = Convert.ToInt32(Session["CapRes_SkillsetUpdatePanel_Row"].ToString());
UpdatePanel pnlSkillsetsMain = grdResources.Rows[nUpdatePanelID].FindControl("pnlSkillsetsMain") as UpdatePanel;
GridView grdSkillsets = pnlSkillsetsMain.Controls[0].FindControl("CascadingSkillsets1").FindControl("grdSkillsets") as GridView;
grdSkillsets.DataBind();

ModalPopupExtender.Hide();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM