如何从子页面触发更新面板回发?

时间:2009-10-22 16:48:36

标签: c# asp.net ajax gridview updatepanel

我在gridview中的每一行的单元格中都有一个更新面板。用户单击此更新面板中的链接按钮以显示(使用window.open())弹出窗口。在弹出窗口中采取操作,更新上述更新面板中包含的数据。我想在弹出窗口关闭时仅为该更新面板触发更新。

最好的方法是什么?我正在研究捕获window.close事件并以某种方式传递一个值,该值指示弹出窗口的调用位置,然后在javascript中调用该更新面板的回发。如果它有所作为(至少它会 - 在我的javascript代码中) - 我正在使用母版页并且只编写IE。

发现这个:http://forums.asp.net/p/1166328/1941797.aspx使用window.opener.document ...再一次,使用母版页使问题变得复杂。

6 个答案:

答案 0 :(得分:1)

您可以使用javascript函数__doPostBack('eventTarget','eventArgument')。 客户端可能看起来像这样。

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

在服务器端你应该使用UpdateMode = Update条件和隐藏按钮,如rick schott所说。棘手的部分是知道需要更新的单元。如果您将OnClick连接到hiddenbutton,则会在__doPostBack调用时触发该事件。您可以从服务器端访问Request.Form [“__ EVENTARGUMENT”]以访问__doPostBack发送的值。您可以使用此值来播放需要更新的单元格。

答案 1 :(得分:0)

我是从Flash应用程序完成的。我的“黑客”如果你将隐藏一个真正的ASP:按钮与CSS。该按钮位于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" />

答案 2 :(得分:0)

您可以使用调用页面上的隐藏字段来存储回调所需的任何值。弹出窗口可以使用window.opener将值存储在这些隐藏字段中。

您可以展开window.open函数,通过引用调用者来更新页面上的javascript变量:

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

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

如果您将隐藏字段设为asp控件,那么您将可以在更新面板的回发中访问它们。

编辑:

考虑一个modalpopup来消除人们在点击主叫页面时遇到的问题,而期望他们使用弹出窗口。

答案 3 :(得分:0)

我选择的更简单(和工作)的解决方案是使用gridview单元格中用户控件中的ModalPopupExtender来实现此解决方案。用户控件包含只读结果网格和ModalPopupExtender。弹出窗口允许您在父网格的单元格内编辑该网格的内容。单击“添加”按钮后,将以异步方式更新迷你网格。

最终让我找到工作解决方案的几个关键项目......

  • 在更新面板
  • 中包装PopupControlId属性中引用的面板内容
  • 隐藏并显示
  • 背后的代码中的模态弹出窗口
  • 使用多个ModalPopupExtenders的简单good example网格视图

答案 4 :(得分:0)

这两种方式对我有用

(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
     

sender,EventArgs e);           公共事件RefreshButtonClickHandler   onRefreshButtonClick;

在你的按钮点击事件中的类内部执行此操作

        if(null == onRefreshButtonClick)
        {
            return;                
        }

        onRefreshButtonClick(sender, e);

然后在Child页面的Page_Load方法中将此事件与本地处理程序

联系起来
        Child child = (child) this.Master;
        reports.onRefreshButtonClick += new
     

子   .RefreshButtonClickHandler(reports_onRefreshButtonClick);

这里Child是我的代码隐藏文件的名称

创建

    void child_onRefreshButtonClick(object sender, EventArgs e)
    {

    }

你完成了

答案 5 :(得分:0)

我放弃了在单独窗口中执行此操作的努力,并使用AJAX ModalPopupExtender开发了解决方案。 Matt Berseth的example非常有帮助。

要更新父网格中更新面板中包含的子网格,我在会话变量中存储了单击按钮的行的值,然后使用名为子网格的数据绑定方法的值。用户已做出选择并点击了保存。

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();