随笔 - 103  文章 - 0 评论 - 363 trackbacks - 33
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

☆ 有些事現在不做,就一輩子都不會做了 ☆

与我联系

搜索

 

常用链接

留言簿(1)

我参加的小组

我的标签

随笔分类

随笔档案

部落格

最新评论

阅读排行榜

评论排行榜

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



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

    Protected 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)

 

posted on 2008-06-21 01:51 jeff377 阅读(2765) 评论(20)  编辑 收藏 网摘 所属分类: ASP.NET 进阶GridView

FeedBack:
#1楼  2008-06-21 08:18 沙发 [未注册用户]
貌似更麻烦!
  回复  引用    
确实麻烦,

  回复  引用    
#3楼  2008-06-21 09:04 T2噬菌体      
我觉得,一个良好的UI不应该让GridView再嵌入GridView,感觉这样界面显得怪异而臃肿。可以考虑Ajax技术应用,如在某个记录上一点击,就出现一个模态DIV,显示另一个GridView
  回复  引用  查看    
#4楼  2008-06-21 09:05 Justin      
@T2噬菌体
赞同
  回复  引用  查看    
#5楼  2008-06-21 09:13 jiduspace [未注册用户]
很赞成您的看法,GridView套GridView没多大意思,应该更多考虑用户感受。
--引用--------------------------------------------------
T2噬菌体: 我觉得,一个良好的UI不应该让GridView再嵌入GridView,感觉这样界面显得怪异而臃肿。可以考虑Ajax技术应用,如在某个记录上一点击,就出现一个模态DIV,显示另一个GridView
--------------------------------------------------------

  回复  引用    
#6楼 [楼主] 2008-06-21 09:37 jeff377      
@T2噬菌体
我也没用这种方式在呈现Master-Detail的数据,会写这个范例只是单纯是因为看到一篇论譠讨论,以探究的角度来撰写此范例。

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2653195&SiteID=14

  回复  引用  查看    
#7楼 [楼主] 2008-06-21 09:40 jeff377      
@沙发
你應該去看一下微軟網站上的範例,才會知道什麼叫麻煩了 ^^

http://thesource.ofallevil.com/taiwan/msdn/columns/huang_jhong_cheng/ASP_NET_GridView.htm
  回复  引用  查看    
#8楼  2008-06-21 10:14 鼠标王 [未注册用户]
这种写法对于用户来说,不是很友好。

http://www.applelei.com
  回复  引用    
#9楼 [楼主] 2008-06-21 10:31 jeff377      
@鼠标王
你似乎贴错网址了
  回复  引用  查看    
#10楼  2008-06-21 11:46 王孟军!      
楼主是台湾人吗?
繁体字
  回复  引用  查看    
#11楼 [楼主] 2008-06-21 12:10 jeff377      
@王孟军!
是的,我是台湾人。
  回复  引用  查看    
#12楼  2008-06-21 12:39 charry      
学习了
  回复  引用  查看    
#13楼  2008-06-22 10:42 茄哩啡.NET      
你是台湾人,在大陆工作吗?(貌似我很喜欢知道人家的隐私,哈哈)
  回复  引用  查看    
#14楼 [楼主] 2008-06-22 11:13 jeff377      
@茄哩啡.NET
我在台湾工作,偶尔才会到大陆去出差
  回复  引用  查看    
#15楼  2008-06-23 13:20 蜀山雪狼      
楼主真有个性,前面一段用简体,后面用繁体。
  回复  引用  查看    
#16楼 [楼主] 2008-06-23 13:39 jeff377      
@蜀山雪狼
Sorry. 没有注意到简繁混杂了。
  回复  引用  查看    
点击 GridView,展示那一行的详细信息,可以用到个 DetailsView吧,或者链接到另一个页面! 我就赞同 T2噬菌体的思路!
  回复  引用    
#18楼  2008-08-01 11:40 jimmyf [未注册用户]
晕,不会是冒充货吧
  回复  引用    
#19楼  2008-12-16 11:23 -阿培 [未注册用户]
好假哦,不会是在博客上转载了别人的东西吧,又或许用的繁体的vs工具呢?
不管楼主什么身份,哈哈,对于其辛勤劳动表示感谢。
  回复  引用    
#20楼 [楼主] 2008-12-16 11:29 jeff377      
@-阿培
這是原創的文章,一點都不假,因為我是台灣人,所以畫面是繁體的。
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:


相关搜索:
GridView SqlDataSource

相关链接: