65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Ajax 从弹出窗口填充父网格

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.40/5 (2投票s)

2007 年 11 月 20 日

CPOL

2分钟阅读

viewsIcon

52875

downloadIcon

665

本文讨论了从弹出窗口或子窗口与网页通信的方式,包括服务器端和客户端。一种从弹出窗口填充网格的方法:当编辑网格中的行时,您可以在父窗口中同时显示编辑后的记录,而无需从子弹出窗口进行回传。

引言

我看到很多人请求从弹出页面控制父网页,所以我决定写这篇文章。 本文解释了如何使用 AJAX 从弹出窗口调用父服务器级函数。

为此,我使用填充网格作为示例。 这里我有一个数据网格,其中包含用于编辑每一行的按钮。 当我单击该按钮时,会弹出一个弹出窗口 (popup.aspx),其中包含所选行的字段。

编辑完行后,网格将从弹出窗口刷新,而无需回传到服务器。 我使用 Ajax 功能来做到这一点。

Using the Code

这里我使用了两个 ASPX 页面。

  1. Default.aspx
  2. popup.aspx

我维护一个隐藏按钮 (btnReload) 只是为了填充网格。 在加载 default.aspx 的函数时,我从 Northwind 数据库填充网格。

Private Function FillGrid() As Boolean 

    Dim Sqlstring As String = " select top 10 customerID,companyname," +
        "contactname from customers" 
    Dim Myreader As SqlDataReader = Nothing 
    Connect_SQLDataReader(Myreader, Sqlstring, errmsg) 
    grid.DataSource = Myreader 
    grid.DataBind() 

End Function

在默认页面的 Onload 事件中,我注册了一个 JavaScript 函数 ReloadPage(),该函数将引用重新加载按钮的单击事件。 这就是诀窍。

Protected Sub Page_Load(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles Me.Load 

ScriptManager.RegisterStartupScript(Me.btnReload, Me.GetType, "xxxxx", 
    "function ReloadPage(){" & Page.ClientScript.GetPostBackEventReference(
    Me.btnReload, Nothing) & "}", True) 
If Page.IsPostBack = False Then 
FillGrid() 
End If 

End Sub

请注意,您必须在 Page.IsPostBack 条件之外执行此操作,因为我们必须为每次回传注册脚本以实现 稳定性保证,即您将网格放入 Ajax Update Panel 中。

单击网格的链接按钮时,我弹出了新的 ASPX 页面 popup.aspx,在那里我获取了 rowID 的查询字符串,并填充了用于编辑目的的文本框。

Protected Sub Page_Load(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles Me.Load 

If Page.IsPostBack = False Then 
Dim Sqlstring = "select companyname,
    contactname from customers where customerID='" & 
    Request.QueryString("id") & "'" 
Dim Myreader As SqlDataReader = Nothing 
Connect_SQLDataReader(Myreader, Sqlstring, errMsg) Myreader.Read() 

txtCompanyName.Text = Myreader(0).ToString() 
txtContactName.Text = Myreader(1).ToString() 
Myreader.Close() 

End If 

End Sub

现在,在单击弹出窗口中的保存按钮后,我正在编辑后端的数据,并调用一个 JavaScript 函数 ReloadParent()

Protected Sub Button1_Click(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles Button1.Click 

Dim Sqlstring = "update customers set companyname='" & 
    txtCompanyName.Text & "', contactname='" & txtContactName.Text & 
    "' where customerID='" & Request.QueryString("id") & "'" 
Dim result As Integer 

Try

 Connect_SQLNonQuery(result, Sqlstring, errMsg) 

Catch ex As Exception 

End Try 

ScriptManager.RegisterStartupScript(Me.Page, GetType(String), "Success",
    "ReloadParent('Records Updated')", True) 

End Sub

让我们看看 ReloadParent() 的作用。

function ReloadParent(msg) 
{
    var opener;
    if (window.opener){opener = window.opener;} else{opener = 
       window.dialogArguments;
} 
opener.ReloadPage();
    alert('Records Updated'); //self.close(); 

}

在这里,我正在调用父 JavaScript 函数 opener.ReloadPage();,它将调用父页面的 btnReload 点击事件。 在 btnReload 中,我们像这样调用 Fillgrid() 函数

Protected Sub btnReload_Click(ByVal sender As Object,
    ByVal e As System.EventArgs)
FillGrid()

End Sub
© . All rights reserved.