C# 如何从子页面触发更新面板回发?
对于gridview中的每一行,我在单元格中都有一个更新面板。用户单击此更新面板中的链接按钮以显示(使用window.open())弹出窗口。在弹出窗口中执行操作,更新上述更新面板中包含的数据。我只想在弹出窗口关闭时触发更新面板的更新 最好的方法是什么?我正在研究捕获window.close事件,并以某种方式传递一个值,该值指示从何处调用弹出窗口,然后在javascript中为该更新面板调用回发。如果它有区别的话(至少在我的javascript代码中是这样),我使用的是母版页,并且只为IE编码C# 如何从子页面触发更新面板回发?,c#,asp.net,ajax,gridview,updatepanel,C#,Asp.net,Ajax,Gridview,Updatepanel,对于gridview中的每一行,我在单元格中都有一个更新面板。用户单击此更新面板中的链接按钮以显示(使用window.open())弹出窗口。在弹出窗口中执行操作,更新上述更新面板中包含的数据。我只想在弹出窗口关闭时触发更新面板的更新 最好的方法是什么?我正在研究捕获window.close事件,并以某种方式传递一个值,该值指示从何处调用弹出窗口,然后在javascript中为该更新面板调用回发。如果它有区别的话(至少在我的javascript代码中是这样),我使用的是母版页,并且只为IE编码
找到:它使用window.opener.document。。。同样,使用母版页会使事情复杂化。我是通过Flash应用程序完成的。如果你愿意,我的“黑客”是用CSS隐藏一个真正的ASP:按钮。按钮在UpdatePanel中。我将Button.ClientId传递给外部资源(Flash、新窗口等)。当外部资源(在我的例子中是Flash)完成时,它调用一个JavaScript函数,该函数接受ClientId并调用按钮上的.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" />
标记:
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" />
--这用于使用javascript从Flash捕获事件,请勿删除--->
您可以使用调用页面上的隐藏字段来存储回调所需的任何值。弹出窗口可以使用window.opener将值存储在这些隐藏字段中
您可以展开window.open函数来更新页面上的javascript变量,并引用调用者:
<asp:button onclientclick="buttonClicked(this)" />
var lastButton;
function buttonClicked(button) {
lastButton = button;
window.open(x);
return false;
}
var lastButton;
功能按钮点击(按钮){
lastButton=按钮;
窗口。打开(x);
返回false;
}
如果将隐藏字段设为asp控件,则可以在“更新”面板的回发中访问这些字段
编辑:
考虑使用modalpopup来消除人们在您希望他们使用弹出窗口时单击呼叫页面时出现的问题。我选择的更简单(有效)的解决方案是在gridview单元格的用户控件中使用ModalPopupXtender来实现这一点。用户控件包含只读结果网格和ModalPopupXtender。弹出窗口允许您在父网格的单元格内编辑该网格的内容。单击“添加”按钮后,将异步更新迷你网格
一些关键的项目最终让我找到了一个有效的解决方案
- 将PopupControlId属性中引用的面板内容包装到更新面板中
- 隐藏并显示代码隐藏中的模式弹出窗口
- 使用多个ModalPopupExtenders的gridview的简单和简单示例
- 这两种方法对我都适用
(1) 通过从母版页引用子页
此代码位于母版页中,在我的按钮上单击“我正在使用contentplaceholder”以查找其中控件的引用。这里dvwOrder是我的数据视图,“upOrders”是我的UpdatePanel
(2) 通过代表
将此委托和eventhandler放在任何方法之外的母版页上
发送方,事件参数(e);
公共事件刷新按钮ClickHandler
点击刷新按钮
在类内部的按钮单击事件中执行此操作
然后在子页面的page_Load方法中将此事件与本地处理程序绑定
孩子
.RefreshButtonClickHandler(报告\u onRefreshButtonClick)
这里的Child是我的代码隐藏文件名
创造
void child_onRefreshButtonClick(object sender, EventArgs e)
{
}
您已经完成了我放弃了在单独的窗口中完成这项工作的努力,而是使用AJAX ModalPopupXtender开发了解决方案。马特·贝塞思的很有帮助 为了更新父网格中更新面板中包含的子网格,我将单击按钮所在行的值存储在会话变量中,然后在用户做出选择并单击保存后使用该值(称为子网格的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();
您可以使用javascript函数uu doPostBack('eventTarget','eventArgument')。 在客户端可能是这样的
function showPopup()
{
var return = window.showModalDialog('someurl','','');
if(return)
{
// do postback for update
__doPostBack('<%= hiddenButton.ClientID %>','eventArgument');
}
}
函数showPopup()
{
var return=window.showmodaldiallog('someurl','');
如果(返回)
{
//进行回发以更新
__doPostBack(“”,'eventArgument');
}
}
在服务器端,您应该像rick schott所说的那样使用带有UpdateMode=条件和隐藏按钮的更新面板。棘手的部分是要知道哪个单元格需要更新。如果将OnClick连接到hiddenbutton,则调用doPostBack时,它将触发该事件。您可以从服务器端访问Request.Form[“\uuuu EVENTARGUMENT”]以访问\uuuu doPostBack发送的值。您可以使用该值,例如需要更新的单元格。这就是我一直在走的道路。我遇到的问题是添加OnClientClick-in-code-behind的代码,该代码使用隐藏按钮的id(我使用的是母版页,因此id的前缀是“ctl00\u MasterContentHolder\u grdResources\u ctl02”…),当我添加call-in-code-behind时,javascript没有被调用。我在OnLoad事件中这样添加它:btnAdd.OnClientClick=“callback(“+sUpdateButtonID+”);”;如果将JavaScript硬编码为测试,会发生什么?如果您使用控件的ClientId,它将为您解析其命名容器。@JBoyd-而不仅仅是使用SUpdateButtonID,请使用SUpdateButton.ClientId。这将是ASP生成的ID,带有添加到页面上每个控件的所有前缀内容。此链接提供了一个示例,说明如何动态填充面板,以便不会为gridview中的每一行重新创建面板:我与您有相同的问题,但我不喜欢ModalPopupXtender禁用父页面的方式。+1因为这是相同的我有一个好主意和一个很好的解释。@JBoyd还阅读了这篇文章,以了解关于uu doPostBack javascript事件的更多信息。使用此met
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();
function showPopup()
{
var return = window.showModalDialog('someurl','','');
if(return)
{
// do postback for update
__doPostBack('<%= hiddenButton.ClientID %>','eventArgument');
}
}