[英]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。 彈出窗口允許您在父網格的單元格內編輯該網格的內容。 單擊添加按鈕后,小型網格將異步更新。
幾個關鍵項目終於使我找到了可行的解決方案...
這兩種方式都對我有效
(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.