** By: ** Donny Mack
Level: Intermediate
Posted Date: 1/2/2002
Tested with ASP.NET ** Beta 2 (v.1.0.2914.16) **
Click here to download sample code
** 在 ** ** DataGrid ** ** 中创建一个弹出式 ** ** Details ** ** 窗口
** 这篇文章来自 DotNetJunkie 的提议。他最初写信要求我们提供一个关于如何创建在 DataGrid 中使用 HyperLinkColumn 的例子,可以在用户点击这一列后打开一个新窗口,显示出此列的详细内容。在此之前我们曾经通过 email 回答他们,他建议我们将这个方法加入他们的指南中,于是,就有了这篇文章。像我们原来的文章一样,它很简单,但是简单的包含代码的方法例可以更有效地启发开发者。
这个例子包含两个 WebForms 和一个 css文件 (所有的代码都可以下载)--第一个 WebForm 包含一个展示从 Northwind 库中读出的产品列表的DataGrid, hyperlink 的 states 设为“ SeeDetails”, 一旦这个链接被点击, JavaScript片段 Window.Open 方法就会被调用 . 用户想获得的关于产品的ProductID做为参数包含在 URL 中 . 包含另一个 DataGrid 的第二个 Webforms 向用户列示他选中产品的所有具体细节。 让我们来看一下 WebForm1.asp 和 WebFiorm1.aspx.cs.
** WebForm1.aspx **
1@ Page language="c#" AutoEventWireup="false" Inherits="HowTos.DataGrid.PopupWindow.WebForm1"
1<html>
2<head>
3<link href="StyleSheet1.css" rel="stylesheet" type="text/css"/>
4</head>
5<body>
6<center>
7<form id="Form1" runat="server">
8<asp:datagrid autogeneratecolumns="False" font-size="12" id="DataGrid1" runat="server">
9<columns>
10<asp:boundcolumn datafield="ProductID" headerstyle-cssclass="HEADERSTYLE" headertext="Product ID" itemstyle-cssclass="ITEMSTYLEDEFAULT"></asp:boundcolumn>
11<asp:boundcolumn datafield="ProductName" headerstyle-cssclass="HEADERSTYLE" headertext="ProductName" itemstyle-cssclass="ITEMSTYLEDEFAULT"></asp:boundcolumn>
12<asp:hyperlinkcolumn datanavigateurlfield="ProductID" datanavigateurlformatstring="javascript:varwin=window.open('WebForm2.aspx?ProductID={0}',null,'width=692,height=25');" datatextfield="ProductID" datatextformatstring="ShowDetails..." headerstyle-cssclass="HEADERSTYLE" headertext="See Details" itemstyle-cssclass="ITEMSTYLEHYPERLINK"></asp:hyperlinkcolumn>
13</columns>
14</asp:datagrid>
15</form>
16</center>
17</body>
18</html>
** WebForm1.aspx.cs **
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient ;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace HowTos.DataGrid.PopupWindow
{
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
#region User Defined Code
private void Page_Load(object sender, System.EventArgs e)
{
if ( ! this.IsPostBack )
this.BindData();
}
protected void BindData()
{
SqlCommand cmd = new SqlCommand( "SELECT TOP 10 ProductID, ProductName FROM Products", con("Server=LocalHost; DataBase=Northwind; TRUSTED_CONNECTION=TRUE"));
this.DataGrid1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
this.DataGrid1.DataBind();
}
protected SqlConnection con(System.String ConnectionString )
{
SqlConnection c = new SqlConnection( ConnectionString );
c.Open();
return c;
}
#endregion
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
除了 DataNavigateUrlFormatString 外确实没什么困难的,你可以注意到我实际上直接使用了一个 javascript 片段(注:你也可以简单地创建一个 .js 文件或在 WebForm 中使用
1<script></script>
), javascript 如此普及,所以这里不再详细讲解。功能上,它打开一个新的窗口,带 ProductID 查询字串的 WebForm2.aspx , ProductID 的值来自我们的数据源。我们可以看这两个文件:
WebForm2.aspx
1@Page language="c#" AutoEventWireup="false" Inherits="HowTos.DataGrid.PopupWindow.WebForm2"
1<html>
2<head>
3<title>Product Details</title>
4<link href="StyleSheet1.css" rel="stylesheet" type="text/css"/>
5</head>
6<body>
7<asp:datagrid font-size="8" headerstyle-cssclass="HEADERSTYLE" height="50" id="DataGrid1" itemstyle-cssclass="ITEMSTYLEDEFAULT" runat="server" width="675"></asp:datagrid>
8<p align="center">
9<a href="JavaScript:window.close()">close window</a>
10</p>
11</body>
12</html>
WebForm2.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient ;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace HowTos.DataGrid.PopupWindow
{
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
#region User Defined Code
private void Page_Load(object sender, System.EventArgs e)
{
if ( ! this.IsPostBack )
this.BindData();
}
protected void BindData()
{
SqlCommand cmd = new SqlCommand( "SELECT * FROM Products WHERE ProductID = @ProductID", con("Server=LocalHost; DataBase=Northwind; TRUSTED_CONNECTION=TRUE"));
cmd.Parameters.Add(new SqlParameter("@ProductID", SqlDbType.VarChar, 200));
cmd.Parameters["@ProductID"].Value = Request["ProductID"].ToString();
this.DataGrid1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
this.DataGrid1.DataBind();
}
protected SqlConnection con(System.String ConnectionString )
{
SqlConnection c = new SqlConnection( ConnectionString );
c.Open();
return c;
}
#endregion
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
WebForm2.aspx 也很简单,只有一个绑定了 SqlDataReader 的 DataGrid 对象,这个 Reader 从产品库中得到数据, css 文件如下:
StyleSheet1.css
/* Style Sheet */
BODY
{
margin-left: 0;
margin-top:10;
}
.HEADERSTYLE
{
background-color: #3a6ea5;
color: #FFFFFF;
font-weight:bold;
}
.ITEMSTYLEDEFAULT
{
background-color: #C0C0C0;
color: #000000;
font-weight: bold;
}
.ITEMSTYLEHYPERLINK {
background-color: #C0C0C0;
color: #000000;
font-weight: bold;
}
A:LINK
{
color: #000000;
}
A:VISITED
{
color: #000000;
}
A:HOVER
{
color: #3a6ea5;
}
这个指向 details 的超链在最右边一列,如图所示:
** 好了, ** ** 就是这样,很简单吧。下次再见! ** ** Donny Mack. **