[英]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.