GridView内嵌-Detail GridView
在网络上看到很多 GridView 内含子 GridView 的范例,虽然方法不同不过程序代码都有点小复杂,想说难道没有更简单易懂的方法吗? 在此文章中将用十几行的程序代码,就教你快速学会并搞定这种 Master-Detail GridView 的需求。
程序代码实作
我们以 Northwind 数据库为例,首先在页面上放置二组 GridView+SqlDataSoruce,分别系结至 [Orders] 、[Order Details] 这二个资料表。
我們先來看一下它的程式碼及執行結果,後續再做進一步的詳細說明。
我們只要在 GridView 的 RowDataBound 事件撰寫下面十幾行的程式碼就完成了,不要懷疑這已經是全部的程式碼。
执行程序,选取 GridView 的某一数据列,就会展开其子 GridView 。执行换页动作,一样可以正常展开子 GridView。
接下来说明这个范例的一些细节,Master GridView 系结 [Orders] 数据表,设定 DataKeyNames="OrderID",当选取某笔数据时,GridView 的 SelectedValue 就是该笔数据的 OrderID 字段值。另外设定 GridView 的 EnableViewState="False",这个设定主要是让 GridView 选取时都会重新做 DataBind 的动作。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="OrderID" DataSourceID="SqlDataSource1" EmptyDataText="沒有資料錄可顯示。" ForeColor="#333333" GridLines="None" AllowPaging="True" EnableViewState="False">
再来就是 Detail GridView 系结 [Order Details] 数据表,一样设定 GridView 的 EnableViewState="False",且设定 Visible="False",也就是初始状态 Detail GridView 是隐藏的。
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" BackColor="LightGoldenrodYellow" BorderColor="Tan" BorderWidth="1px" CellPadding="2" DataKeyNames="OrderID,ProductID" DataSourceID="SqlDataSource2" EmptyDataText="沒有資料錄可顯示。" ForeColor="Black" GridLines="None" Visible="False" EnableViewState="False">
Detail GridView 所系结的 SqlDataSource 控件,将其 SelectParameters 的 @OrderID 参数关连至 Master GridView 的 SelectedValue。
<SelectParameters> <asp:ControlParameter ControlID="GridView1" Name="OrderID" PropertyName="SelectedValue" Type="Int32" /> </SelectParameters>
再来还有一个重要步骤,就是在 aspx 程序代码中,要设定 Page 的 EnableEventValidation="false",因为我们动态将 Detail GridView Render 出来插入 Master GridView 中,整个控件阶层都被异动,这样会造成事件验证失败。
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default5.aspx.vb" Inherits="Default5" EnableEventValidation="false" %>
另外在 Master GridView 的 RowDataBound 事件中,有一个 ControlToHTML 方法是取得 Detail GridView 的 HTML 码,这个方法可以参考笔者另一篇「GridView执行RenderControl产生的错误」文章有详细说明。
Dim sHTML As String = Bee.Web.WebFunc.ControlToHTML(GridView2)
加支付宝好友偷能量挖...