利用ASP.NET DataGrid顯示主次關系的數據
2024-07-10 12:55:49
供稿:網友
大家在實際工作中有沒有遇到要在datagrid中顯示帶有主次結構的數據呢?如果你對ado.net和sql server2000熟悉的話,我們下面就舉一個利用vs.net自帶的示例數據庫northwind和vb.net來說明如何實現這一目標。
首先,我們先準備要顯示的帶有主次結構的數據。
下面就是要綁定到hierarchicaldatagrid.aspx的vb.net代碼文件hierarchicaldatagrid.aspx.vb的內容:
imports system.data.sqlclient
public class hierarchicaldatagrid
inherits system.web.ui.page
protected withevents datagrid1 as system.web.ui.webcontrols.datagrid
#region " web form designer generated code "
'下面的調用對web form設計器來說是必須的
<system.diagnostics.debuggerstepthrough()> private sub initializecomponent()
end sub
private sub page_init(byval sender as system.object, byval e as system.eventargs) handles mybase.init
'codegen: 這個方法是為web form設計器調用的
'不要用代碼編輯器改變這里.
initializecomponent()
end sub
#end region
private sub page_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
'打開數據庫連接
dim ordersconnection as new sqlconnection("server=(local)/netsdk;database=northwind;trusted_connection=yes")
'得到訂單和訂單詳細信息
dim orderadapter as new sqldataadapter("select * from orders; select orderid ,products.productname,[order details].unitprice,[order details].quantity,[order details].discount from [order details],products where [order details].productid=products.productid", ordersconnection)
'創建并填充dataset對象
dim orderdataset as new dataset()
orderadapter.fill(orderdataset)
'設定表名字
orderdataset.tables(0).tablename = "orders"
orderdataset.tables(1).tablename = "order details"
'在基于orderid字段的兩個表之間建立父子關系
dim parent as datacolumn = orderdataset.tables("orders").columns("orderid")
dim child as datacolumn = orderdataset.tables("order details").columns("orderid")
dim orderrelation as datarelation = new datarelation("orderrelation", parent, child, false)
'為dataset添加關系
orderdataset.relations.add(orderrelation)
'把datagrid綁定到orders表
datagrid1.datasource = orderdataset.tables("orders").defaultview
databind()
end sub
private sub datagrid1_itemdatabound(byval sender as object, byval e as system.web.ui.webcontrols.datagriditemeventargs) handles datagrid1.itemdatabound
e.item.cells(0).backcolor = system.drawing.color.ivory
end sub
end class
在hierarchicaldatagrid.aspx中,我們為datagrid1建立模板列,并把另外一個datagrid嵌入到這個模板列,父一級的datagrid用來顯示主記錄,比如:訂單。子一級datagrid用來顯示詳細信息,比如:訂單的詳細信息。我們這樣為子datagrid動態指定數據源:
datasource='<%# ctype(container.dataitem,datarowview).createchildview("orderrelation") %>'>
上面這句就是實現顯示主次關系數據的關鍵。根據當前父一級記錄,datarowview.createchildview利用前面創建的關系的名字作為參數獲得子記錄,并把它綁定到子datagrid上。
下面就是我們要顯示的aspx頁面的代碼,hierarchicaldatagrid.aspx:
<%@ page language="vb" autoeventwireup="false" codebehind="hierarchicaldatagrid.aspx.vb" inherits="hierarchicaldatagrid.hierarchicaldatagrid" %>
<%@ import namespace="system.data"%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>顯示主次關系數據的例子</title>
<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="frmdatagrid" method="post" runat="server">
<p align="center">
<asp:datagrid id="datagrid1" bordercolor="#0099ff" runat="server" showheader="false" width="470px" cellpadding="0" cellspacing="0" autogeneratecolumns="false" borderwidth="2px">
<columns>
<asp:templatecolumn>
<itemtemplate>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td bgcolor="#ff6600"><b>訂單號:
<%# databinder.eval(container.dataitem, "orderid") %>
</b>
</td>
</tr>
<tr>
<td align="right">
<asp:datagrid id=datagrid2 runat="server" autogeneratecolumns="false" bordercolor="#33ff33" datakeyfield="orderid" datasource='<%# ctype(container.dataitem,datarowview).createchildview("orderrelation") %>'>
<headerstyle font-bold="true" forecolor="#cc0066" backcolor="#ffccff"></headerstyle>
<columns>
<asp:boundcolumn visible="false" datafield="orderid" readonly="true"></asp:boundcolumn>
<asp:templatecolumn headertext="產品名稱">
<headerstyle width="300px"></headerstyle>
<itemtemplate>
<%# databinder.eval(container.dataitem, "productname") %>
</itemtemplate>
</asp:templatecolumn>
<asp:boundcolumn datafield="unitprice" headertext="單價"></asp:boundcolumn>
<asp:boundcolumn datafield="quantity" headertext="數量"></asp:boundcolumn>
<asp:boundcolumn datafield="discount" headertext="折扣"></asp:boundcolumn>
</columns>
</asp:datagrid></td>
</tr>
</table>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid></p>
</form>
</body>
</html>