内置的 datagrid 列
了解问题的大概情况后,现在我们后退一步,看一下 asp.net 中构建的 5 种 datagrid 列类型及其父类型 datagridcolumn。
boundcolumn。这是文本字段的标准显示。它显示为纯文本,但是当 datagrid 处于“编辑”模式时,它将转换为 textbox。还可以选择格式化选项。
hyperlinkcolumn。用于显示文本数据,还代表一个 web 地址 (url)。url 可以与显示文本相同,也可以不同,它们都可以单独设置。它显示为 <a href=...> 标记。
buttoncolumn。它使用户能够按行与网格进行交互。它可以显示为超链接 linkbutton (<a href=...>) 或 pushbutton (<input type="button">)。单击该按钮时将触发 postback,而在 datagrid 上触发 itemcommand 事件。
editcommandcolumn。它与 buttoncolumn 类似,但是它自动创建用于编辑 datagrid、取消或提交更改的按钮。触发 itemcommand 事件,以及所单击按钮的特定事件:editcommand、cancelcommand 或 updatecommand。
templatecolumn。用于完全控制显示给用户的控件,分为多种模板,例如 itemtemplate 和 edititemtemplate。任何 asp.net 或 html 控件或控件组都可以放置在这些模板中。
注意:直接使用这些列类型之前,请关闭 autogeneratecolumns(运行时自动生成列)。然后,您可以在属性生成器中使用这些列类型,或者直接在 aspx 文件的 html 代码中使用。
图 2:从 datagridcolumn 中继承的 5 种内置列
尽管这些列类型非常有用,它们不过是了解 datagrid 列内容的开始。
传统方法:templatecolumn 中的 dropdownlist
在研究如何创建新列类型之前,首先让我们看一下如何通过直接在 templatecolumn 内使用 dropdownlist 解决下拉列表的问题,而不用自定义列。itemtemplate 将只包含表示当前值的纯文本表示,而 edititemtemplate 包含一个需要在运行时管理的 <asp:dropdownlist> 控件。
<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" />
<asp:templatecolumn headertext="ship method">
<itemtemplate>
<%#container.dataitem("shipvia")%>
</itemtemplate>
<edititemtemplate>
<asp:dropdownlist runat="server" id="dropdownlist1"/>
</edititemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
绑定 datagrid 的代码:
sub bindgrid()
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")
datagrid1.datasource = ds.tables("orders").defaultview
datagrid1.databind()
end sub
当前编辑的项目是在触发 datagrid 的 itemdatabound 事件时绑定到 dropdownlist 的。使用 itemdatabound 事件时,请检查当前项目的 listitemtype,否则您可能会发现您正在使用 headeritem 或其他不适用的项目类型。为 edititem 引用 dropdownlist 控件。在下面的代码中,我直接使用单元格控件集进行说明(为了与后面的示例保持一致),但是,您可以采用简单的方法,直接为 dropdownlist 控件指定 id,并使用 datagrid 项目的 findcontrol 方法定位控件引用。由于 datagrid 被绑定到 datatable 的默认视图,而该视图的元素属于 datarowview 类型,所以您可以将当前项目的 dataitem 属性转换为一个 datarowview 实例。这样,您可以按字段名直接引用 dataitem 中的字段。使用这种方法,将“shipvia”的当前值保存到该记录中,并使用它选择相应的下拉列表项。
private sub datagrid1_itemdatabound(byval sender as object, _
byval e as system.web.ui.webcontrols.datagriditemeventargs) _
handles datagrid1.itemdatabound
if e.item.itemtype = listitemtype.edititem then
dim drv as datarowview = ctype(e.item.dataitem, datarowview)
dim currentship as string = drv("shipvia")
dim ddl as dropdownlist = ctype(e.item.cells(4).controls(1), dropdownlist)
dim sql as string = "select shipperid, companyname from shippers order by shipperid"
dim da as sqldataadapter = new sqldataadapter(sql, connstr)
dim ds as new dataset
dim item as listitem
da.fill(ds, "shippers")
ddl.datasource = ds.tables("shippers").defaultview
ddl.datatextfield = "companyname"
ddl.datavaluefield = "shipperid"
ddl.databind()
item = ddl.items.findbyvalue(currentship)
if not item is nothing then item.selected = true
end if
end sub
最后,编写从 dropdownlist 中检索当前选定值的代码,并执行数据库更新:
private sub datagrid1_updatecommand(byval source as object, _
byval e as system.web.ui.webcontrols.datagridcommandeventargs) _
handles datagrid1.updatecommand
dim ddl as dropdownlist = ctype(e.item.cells(4).controls(1), dropdownlist)
dim newship as integer = ddl.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
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 注册表 操作系统 服务器 应用服务器