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

从弹出窗口刷新父页面上的 GridView 控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.97/5 (22投票s)

2006年3月8日

4分钟阅读

viewsIcon

267505

本文介绍如何从弹出窗口刷新父页面上的 GridView 控件。

引言

在本文中,我将向您展示如何从弹出窗口刷新父页面上的 GridView 控件。我将讨论不同的场景,这些场景在实现解决方案时将非常有用。

数据库表

我将在此文章中使用我自己的自定义表。表名为 Users,它包含 UserIDUserNameFirstNameLastName 列。UserID 是一个自动生成的主键。这是 Users 表的架构

if exists (select * from dbo.sysobjects where 
     id = object_id(N'[dbo].[Users]') and 
     OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Users]
GO

CREATE TABLE [dbo].[Users] (
[UserID] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[FirstName] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[LastName] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO

创建父页面

父页面将包含一个 GridView 控件和一个 href 标签。该 href 标签将打开一个新的弹出窗口,用于将数据插入数据库并刷新父页面上的 GridView 控件。让我们看看父页面的实现。

父页面的后台代码

protected void Page_Load(object sender, EventArgs e)
{
  BindData();
}

private void BindData()
{
  // make the query
  string query = "SELECT * FROM Users";
  SqlConnection myConnection = new SqlConnection(ConnectionString);
  SqlDataAdapter ad = new SqlDataAdapter(query, myConnection);

  DataSet ds = new DataSet();

  ad.Fill(ds,"Users");
  GridView1.DataSource = ds;
  GridView1.DataBind();
}

private string ConnectionString
{
  get { return @"Server=localhost;Database" + 
               @"=MyDatabase;Trusted_Connection=true"; }
}

正如您所见,我没有做什么花哨的事情。我只是使用 BindData 方法中的 SELECT 查询从数据库中填充 GridView

父页面还包含用于打开弹出窗口的 href 标签。让我们在页面的 HTML 视图中查看此 href 标签的代码。

<a href="#" onclick="OpenWindow()">Insert Data
<script language="javascript" type="text/javascript"> function OpenWindow() { window.open ("PopUpWindow.aspx", "mywindow", "menubar=0,resizable=0," + "width=350,height=250,toolbars=0"); } </script>

很简单,对吧?当您单击 href 标签时,将触发 OpenWindow 函数。这将打开一个小的弹出窗口。请看下面的屏幕截图,以便更清晰地了解

是的,您猜对了,包含用户名、名字和姓氏文本框的小窗口就是我们的小弹出窗口。现在,在填写完文本框中的所有必需信息并按“添加用户”按钮后,我们希望它将用户添加到数据库并刷新包含 GridView 控件的父页面,从而将新插入的数据填充到 GridView 中。

弹出页面的实现

现在,让我们看看弹出页面的实现方式。首先,让我们看看弹出页面的 HTML 代码,这样我们就会知道页面上的控件是如何设置的。

<form id="form1" runat="server">
 <div>
  UserName: <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox><br>
  FirstName:<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox><br>
  LastName:<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox><br>

  <asp:Button ID="BtnAdd" runat="server" Text="Add User" OnClick="BtnAdd_Click"/>
  <asp:Button ID="Btn_CloseWindow" runat="server" Text="Close Window"/>
 </div>
</form>

现在,让我们实现将数据插入数据库的代码。当用户按下“添加用户”按钮时,将触发以下代码。

private void AddUser(string userName, string firstName, string lastName)
{
  string QUERY_ADDUSER = @"INSERT INTO Users(UserName," + 
         @" FirstName, LastName) VALUES(@UserName,@FirstName,@LastName)";
  SqlConnection myConnection = new SqlConnection(ConnectionString);
  SqlCommand myCommand = new SqlCommand(QUERY_ADDUSER, myConnection);
  myCommand.Parameters.AddWithValue("@UserName", userName);
  myCommand.Parameters.AddWithValue("@FirstName", firstName);
  myCommand.Parameters.AddWithValue("@LastName", lastName);
  myConnection.Open();
  myCommand.ExecuteNonQuery();
  myConnection.Close();
}

上面的代码只是将参数附加到参数化查询并将它们插入数据库。我敢肯定您已经多次做过类似的事情。

现在,让我们看看刷新包含 GridView 的父页面的代码。

刷新父页面上的 GridView 控件

刷新父页面上的 GridView 控件听起来很棒!抱歉这个糟糕的笑话,让我们回到正题。刷新 GridView 控件非常简单。看看下面的代码

protected void Page_Load(object sender, EventArgs e)
{
  string scriptString = "<script language=JavaScript> " + 
         "window.opener.document.forms(0).submit(); </script>";

  // ASP.NET 2.0
  if (!Page.ClientScript.IsClientScriptBlockRegistered(scriptString))
  {
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), 
                                       "script", scriptString);
  }

  //// ASP.NET 1.X
  //if (!Page.IsClientScriptBlockRegistered(scriptString))
  //{
  // Page.RegisterClientScriptBlock("script", scriptString);
  //}

  if (!Page.IsPostBack) { }
  }

我包含了两个版本的代码。如果您使用的是 Visual Studio .NET 2003 或 .NET Framework 1.X,则可以使用注释掉的代码。在 Page_Load 事件中,我只是将客户端脚本附加到页面。脚本 window.opener.document.forms(0).submit(); 意味着将提交当前页面的父级。这将导致父页面发生回发,并且由于我们在每次页面加载时都绑定 GridView 控件,因此它将正常工作。请看下面的屏幕截图

所以,您看到了,它很简单,对吧?现在,让我们处理一些重要的事情。比如说,当按下“关闭窗口”按钮时,您想关闭该窗口。您可以通过简单地将 JavaScript 函数 "window.close()" 附加到按钮单击事件来完成此操作。

// ASP.NET 2.0
Btn_CloseWindow.OnClientClick = "window.close();";

// ASP.NET 1.X
Btn_CloseWindow.Attributes.Add("onclick", "window.close();");

您可能想将窗口关闭事件附加到“添加用户”按钮。这样,当添加用户时,弹出窗口会自动关闭。为此,您可以使用 OnUnload 事件。查看下面的代码

<body onunload="opener.location.reload();">

正如我已经解释过的,JavaScript 函数 window.opener.document.forms(0).submit(); 将导致回发,并且为了使用此示例,您需要在每次加载页面时绑定 GridView。这不是一个好主意,您可以通过使用 opener.location.reload(); 函数来改进这一点,该函数将重新加载父页面。这样,您就可以仅在页面重新加载时绑定 GridView 和其他控件,而不是在回发时。要使用 opener.location.reload();,只需将其附加到父页面的 OnUnload 事件,如下所示

<body onunload="opener.location.reload();">

另外请记住,在使用 opener.location.reload() 时,您无需注册任何脚本。

希望您喜欢这篇文章,祝您编码愉快!

© . All rights reserved.