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

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

    Protected Sub GridView1_RowDataBound()Sub GridView1_RowDataBound(ByVal sender As Object, ByVal 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)

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

  1. 零基础如何用 15 行 Python 代码搞定网易云热门歌单?

    健身.吃饭.敲代码:等车.撸猫.下午茶--若能佐以合适的音乐当"配餐",总是惬意非常.本文就将带你爬一爬网易云的那些热门歌单! 作者 | 上海小胖 责编 | 仲培艺 心情好或心情坏 ...

  2. 再见PDF提取收费!我用100行Python代码搞定!

    点上方"菜鸟学Python",选择"星标" 第471篇原创干货,第一时间送达 大家在日常的工作和学习过程中,都少不了与PDF文件打交道,很多的小伙伴都面临着将P ...

  3. 60行Python代码搞定,王者荣耀雷达图!

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 现有以下表格,我需要画成第二张图中的雷达图(类似fifa足球.王者荣耀里面 ...

  4. 几行 Java 代码搞定图片提取文字功能

    近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract ...

  5. js最小化浏览器_Handtrack.js 开源:3行JS代码搞定手部动作跟踪

    作者|Victor Dibia 译者|薛命灯 近日,GitHub 上开源了一个名为 Handtrack.js 的项目,有了它,你只需要 3 行代码就能用来检测图片中手的动作. 演示地址:https:/ ...

  6. 再见PDF提取收费!我用100行Python代码搞定!去你的收费!

    大家在日常的工作和学习过程中,都少不了与PDF文件打交道,很多的小伙伴都面临着将PDF文件中的文字.图片和表格数据提取出来的问题.能够对PDF文件中的文字.表格等数据进行编辑,网上现存的PDF提取的软 ...

  7. 怎样在python代码中输入π_鼠标自动点击、键盘自动输入?几行Python代码搞定

    相信我,你以后一定会用到.实在不行,你先收藏,做个收藏家,等拿出来,就值钱了. 第一步:安装并导入相关模块 只需要安装PyUserInput,如下: pip install PyUserInput 如 ...

  8. python实现软件自动点击_鼠标自动点击、键盘自动输入?几行Python代码搞定

    第一步:安装并导入相关模块 只需要安装PyUserInput,如下:pip install PyUserInput 如果你是Win10系统,肯定会报错,具体怎么解决,我放在文章结尾讲,先把主要思路讲完 ...

  9. 40行python代码搞定王者荣耀全部壁纸下载

    大家好,我是才哥. 今天我们一起来采集王者荣耀英雄的全部皮肤地址,目标网址: https://pvp.qq.com/web201605/herolist.shtml 通过开发者工具发现 https:/ ...

最新文章

  1. UNIX编程笔记:关于停止的进程接收信号的问题
  2. IT常说的协议指的是什么?—Vecloud微云
  3. Matlab Simulink如何生成谐波
  4. U3D 打包时找不到tag的问题
  5. ntdll 异常代码0xc0000374_不要把异常当做业务逻辑,这性能可能你无法承受
  6. 车祸是怎么发生的 不论你是否开车都该看看!
  7. 40岁从零开始学习软件开发,四年后我成了首席研发
  8. Python画图实战之画K线图【附带自动下载股票数据】
  9. ufs3.0和12G内存哪个对流畅运行影响大?
  10. Windows C++ 获取当前文件夹下有几个文件
  11. linux进程控制(一)--unix环境高级编程读书笔记
  12. Eclipse技巧一:还原视图和编辑器
  13. Java大数类自我需要掌握的
  14. 【雷达通信】雷达一维恒虚警检测CFARmatlab 含GUI
  15. IOS版本APP STORE上架流程
  16. Arcgis空间连接
  17. 布袋除尘器过滤风速多少_布袋除尘器过滤风速怎样计算
  18. 着色 Shading
  19. 回顾丨李开复哥大毕业演讲:工程师的AI银河系漫游指南
  20. 使用fabric.js简简单单实现一个画板

热门文章

  1. linux -cpu
  2. [PyJs系列介绍]三、编译与上线
  3. 高手进阶:/etc/profile环境变量配置解析
  4. 最新17个紫色风格网页设计作品欣赏
  5. 3Com发布新MSR路由器 为企业提供视频播客支持
  6. SyntaxError: (hbase):100: syntax error, unexpected tIDENTIFIER
  7. spark-shell连接数据库java.sql.SQLSyntaxErrorException: Unknown databas
  8. js中输出变量的类型和输出对象的的属性/方法/成员函数
  9. 深度学习(二)——深度学习常用术语解释, Neural Network Zoo, CNN, Autoencoder
  10. curl上传文件linux,在Linux中如何使用curl从一个服务器流式传输文件到另一个服务器(有限的服务器资源)...