使用 dropdowncolumn
以上是创建 dropdowncolumn 类所需的所有代码,下面我们看一看如何在应用程序中使用该控件。如果您是在家中学习,而且还没有开始做,请将上面创建的命名空间编译到 mycustomcolumn.dll 中,并将其复制到您想试验的应用程序的 /bin 文件夹中。本例中,我创建一个新的 web 应用程序 usecustomcolumn,并在我的 /bin 目录的 mycustomcolumn.dll 中添加一个引用。在 aspx 文件的顶部,添加 @register 指令:
<%@ register tagprefix="dgg"
namespace="mycustomcolumn"
assembly="mycustomcolumn" %>
请注意,新的 datagrid 列类型不会为 datagrid 出现在 visual studio .net 属性生成器中,因此您需要进入 html 视图并在其中添加列声明。确保 datagrid 声明位于一组 <form runat="server">...</form> 标记之中,这些标记用于处理 postback。aspx 文件的其余部分应如下所示:
<%@ page language="vb"
autoeventwireup="false"
codebehind="webform1.aspx.vb"
inherits="usecustomcolumn.webform1"
trace="false" debug="true"%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>webform1</title>
<link rel="stylesheet" type="text/css" href="styles.css">
<meta name="generator" content="microsoft visual studio.net 7.0">
<meta name="code_language" content="visual basic 7.0">
<meta name="vs_defaultclientscript" content="javascript">
<meta name="vs_targetschema"
content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body>
<form id="form1" method="post" runat="server">
<asp:datagrid id="datagrid1"
runat="server" cssclass="grid"
autogeneratecolumns="false">
<columns>
<asp:editcommandcolumn
edittext="edit" canceltext="cancel"
updatetext="update" />
<asp:boundcolumn
datafield="orderid"
readonly="true"
headertext="order id"/>
<asp:boundcolumn
datafield="shipname"
headertext="ship to"
readonly="true"/>
<asp:boundcolumn
datafield="shipcountry"
headertext="country"
readonly="true"/>
<dgg:dropdowncolumn datafield="shipvia" headertext="ship method" />
</columns>
</asp:datagrid>
</form>
</body>
</html>
datagrid 被绑定到 northwind 示例的 orders 表,自定义 dropdowncolumn 被绑定到 shipvia 列。现在我只设置 datafield 属性,因为刚刚绑定到一个简单的 arraylist,不需要 datatextfield 和 datavaluefield 属性。如果您有预定义的常数列表或者您需要一个快速设置选项的方法,arraylist 选项最简单。dropdowncolumn 的 datasource 在代码中设置,首先引用 dropdowncolumn:
dim ddc as mycustomcolumn.dropdowncolumn
ddc = ctype(datagrid1.columns(4), mycustomcolumn.dropdowncolumn)
dim al as new arraylist
al.add("shipping company a")
al.add("shipping company b")
al.add("shipping company c")
ddc.datasource = al
下面是运行此代码的结果:
图 3:使用 arraylist
接下来,我需要转换该示例以便使用数据库中的活动表。shipvia 是查找表 shippers 的外键,我在代码中将其指定为 dropdowncolumn 的 datasource。我还需要改变 dropdowncolumn 声明,以包括与 shippers 表中的相应字段匹配的 datatextfield 和 datavaluefield 名称:
<dgg:dropdowncolumn datafield="shipvia" datatextfield="companyname"
datavaluefield="shipperid" headertext="ship method" />
然后将两个 orders 表绑定到 datagrid,将 shippers 表绑定到自定义列:
dim sql as string =
"select orderid, shipname, shipcountry, shipvia from orders"
dim da as sqldataadapter = new sqldataadapter(sql, connstr)
dim ds as new dataset
da.fill(ds, "orders")
'dim cmd as sqlcommand = new sqlcommand(sql, conn)
'conn.open()
'datagrid1.datasource = _
cmd.executereader(commandbehavior.closeconnection)
datagrid1.datasource = ds.tables("orders").defaultview
sql = "select shipperid, companyname " & _
"from shippers order by shipperid"
da.selectcommand.commandtext = sql
da.fill(ds, "shippers")
ddc.datasource = ds.tables("shippers").defaultview
datagrid1.databind()
datagridcolumn 使用活动数据,根据 orders 表中的值(1、2 或 3)自动选择正确的项目,如下所示:
图 4:从数据库中检索数据
使用 dropdowncolumn 的最后一步是检索选定的值以传递回数据库更新。为此,只需在单元格内引用 dropdownlist 控件,并确定其 selectedvalue 属性:
private sub datagrid1_updatecommand( byval source as object, _
byval e as system.web.ui.webcontrols.datagridcommandeventargs) _
handles datagrid1.updatecommand
dim customddl as dropdownlist = _
ctype(e.item.cells(4).controls(0), dropdownlist)
dim newship as integer = customddl.selectedvalue
dim orderid as integer = int32.parse(e.item.cells(1).text)
dim sql as string = "update orders set shipvia=@ship where orderid=@id"
dim conn as sqlconnection = new sqlconnection(connstr)
dim cmd as new sqlcommand(sql, conn)
cmd.parameters.add(new sqlparameter("@ship", newship))
cmd.parameters.add(new sqlparameter("@id", orderid))
conn.open()
cmd.executenonquery()
conn.close()
datagrid1.edititemindex = -1
bindgrid()
end sub
小结
上文概述了如何以 datagridcolumn 为父类型创建一个新类型、如何进行数据绑定以及如何将其应用到实际应用程序中。这只是可重复使用的 datagrid 列的一个示例,因此,您需要检查您自己的应用程序,以确定哪些重复的功能可以封装到其自己的自定义 datagrid 列中。您可以开发自己的列,以解决常见问题(例如,在列中显示 dropdownlist),或满足您公司的特殊需要。您也不必拘泥于本文的示例,只在自定义列中包含一个 asp.net 控件,您可以编写更复杂的结构,例如将一系列控件、第三方内容或整个 datagrid 控件嵌套到列中,以表现多层信息。总之,您可以充分发挥您的想象力。
5个内置的列类型非常有用,它们可以满足使用 datagrid 控件进行显示的大多数情况下的需要。现在并没有开发您自己的控件,只是将一些有意义的内容随便放到 templatecolumn 中。创建自定义列使您可以突破这些限制,在您的 datagrid 应用程序中添加丰富的功能。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器