十几行程序代码搞定 Master-Detail GridView(内含子 GridView)

摘要
在网络上看到很多 GridView 内含子 GridView 的范例,虽然方法不同不过程序代码都有点小复杂,想说难道没有更简单易懂的方法吗?
在此文章中将用十几行的程序代码,就教你快速学会并搞定这种 Master-Detail GridView 的需求。
 
程序代码实作
我们以 Northwind 数据库为例,首先在页面上放置二组 GridView+SqlDataSoruce,分别系结至 [Orders] 、[Order Details] 这二个资料表。



我們先來看一下它的程式碼及執行結果,後續再做進一步的詳細說明。
我們只要在 GridView 的 RowDataBound 事件撰寫下面十幾行的程式碼就完成了,不要懷疑這已經是全部的程式碼。

     Protected   Sub GridView1_RowDataBound() Sub GridView1_RowDataBound(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        
If (e.Row.RowState And DataControlRowState.Selected) = DataControlRowState.Selected Then
            
Dim oRow As New GridViewRow(0-1, DataControlRowType.DataRow, e.Row.RowType)
            GridView2.Visible 
= True
            GridView2.DataBind()
            
Dim sHTML As String = Bee.Web.WebFunc.ControlToHTML(GridView2)
            GridView2.Visible 
= False
            
Dim oCell As New TableCell
            oCell.Text 
= sHTML
            oCell.ColumnSpan 
= e.Row.Cells.Count
            oRow.Cells.Add(oCell)
            e.Row.Parent.Controls.AddAt(e.Row.RowIndex 
+ 2, oRow)
        
End If
    
End Sub

执行程序,选取 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 码,这个方法可以参考笔者另一篇「使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误」文章有详细说明。

Dim  sHTML  As   String   =  Bee.Web.WebFunc.ControlToHTML(GridView2)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值