繁体   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