三.hyperlinkcolumn数据列以及buttoncolumn数据列的应用:
上面我向大家介绍了boundcolumn数据列的应用,而其它的两种数据列:hyperlinkcolumn数据列以及buttoncolumn数据列的应用方式与之相差无几。
hyperlinkcolumn数据列包含了datatextfield属性以及datanavigateurlfield属性等,前者可以用于指定要显示的文本内容,而后者则用于指定超链接。同时hyperlinkcolumn数据列还包含了一个可用于指定文本显示格式的datanavigateurlformatstring属性。
像hyperlinkcolumn数据列那样buttoncolumn数据列也提供了datatextfield属性以及datatextformatstring属性。同时它还提供了一个commandname属性,该属性能指定按钮被点击时服务器端的响应动作。而此时datagrid控件的onitemcommand属性必须指向一个相应的方法,该方法在按钮被点击时会自动被调用。datagrid控件中的一行可以包含多个buttoncolumn数据列,每个数据列中的按钮消息响应函数都是onitemcommand属性所对应的方法,而不同的按钮是根据其commandname属性来区分函数所应执行的不同部分的。buttoncolumn数据列还提供了一个buttontype属性以指定按钮的外观,该属性包括两种可取值:linkbutton(默认)和pushbutton。
下面我们在原来解决方案的基础上再添加一个新的web应用程序项目,并在其中运用datagrid控件的boundcolumn数据列、hyperlinkcolumn数据列以及buttoncolumn数据列。下面是本项目的主要文件以及其代码后置文件的内容:
webform1.aspx:
<%@ page language="c#" codebehind="webform1.aspx.cs" autoeventwireup="false" inherits="datagridtemplates2.webform1" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
<head>
<title>webform1</title>
<meta name="generator" content="microsoft visual studio 7.0">
<meta name="code_language" content="c#">
<meta name="vs_defaultclientscript" content="javascript">
<meta name="vs_targetschema" content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body ms_positioning="flowlayout">
<form id="form1" method="post" runat="server">
<asp:datagrid id="mydatagrid" runat="server" headerstyle-font-bold="true" cellpadding="4" borderwidth="1px" autogeneratecolumns="false" gridlines="horizontal" font-names="verdana,arial,sans-serif" font-size="12px" borderstyle="solid">
<alternatingitemstyle backcolor="#efefef"></alternatingitemstyle>
<itemstyle font-size="x-small"></itemstyle>
<headerstyle font-bold="true" forecolor="white" backcolor="teal"></headerstyle>
<columns>
<asp:boundcolumn datafield="customerid" headertext="id"></asp:boundcolumn>
<asp:hyperlinkcolumn datanavigateurlfield="url" datatextfield="companyname" headertext="comapny name"></asp:hyperlinkcolumn>
<asp:buttoncolumn text="get details" buttontype="pushbutton" commandname="getdetails"></asp:buttoncolumn>
</columns>
</asp:datagrid>
</form>
</body>
</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 datagridtemplates2
{
/// <summary>
/// webform1 的摘要说明。
/// </summary>
public class webform1 : system.web.ui.page
{
protected system.web.ui.webcontrols.datagrid mydatagrid;
private void page_load(object sender, system.eventargs e)
{
// 在此处放置用户代码以初始化页面
if( !page.ispostback )
binddata();
}
private void binddata()
{
sqlconnection con = new sqlconnection( "server=localhost;integrated security=true;database=northwind" );
sqlcommand cmd = new sqlcommand( "select *, 'http://www.' + customerid + '.com' as url from customers", con );
try
{
con.open();
mydatagrid.datasource = cmd.executereader();
mydatagrid.databind();
con.close();
}
catch( exception ) {}
if( con != null && con.state == connectionstate.open )
con.close();
}
#region web form designer generated code
override protected void oninit(eventargs e)
{
//
// codegen:该调用是 asp.net web 窗体设计器所必需的。
//
initializecomponent();
base.oninit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void initializecomponent()
{
this.mydatagrid.itemcommand += new system.web.ui.webcontrols.datagridcommandeventhandler(this.mydatagrid_itemcommand);
this.load += new system.eventhandler(this.page_load);
}
#endregion
private void mydatagrid_itemcommand(object source, system.web.ui.webcontrols.datagridcommandeventargs e)
{
if( e.commandname == "getdetails" )
response.redirect( "webform2.aspx?id=" + e.item.cells[0].text );
}
}
}
项目创建完毕,在浏览器中运行的效果如图2所示:

图2 datagrid控件中运用hyperlinkcolumn以及buttoncolumn数据列显示数据的效果。