前言: <!-说明:上面代码(下同)OnRowDataBound事件是父子网格控件的关键,用于点击父网格时绑定子网格的数据源),这是每个父子网格都不能少的。而DataKeyNames参数则是子网格绑定数据源的依据,即子网格根据父网格该行的GRNLot读取数据。!-> <Columns> <!-父网格固定列-!> <asp:BoundField DataField="ProductNM" HeaderText="品号" ReadOnly="true"/> <asp:BoundField DataField="GRNLot" HeaderText="GRNLot" ReadOnly="true"/> <asp:BoundField DataField="ProdQty" HeaderText="数量" ReadOnly="true"/> <!-父网格固定列完成-!> <!-将子网格作为父网格的一列-!> <asp:TemplateField HeaderText="详细批号"> <ItemTemplate> <!-显示/隐藏子网格的链接-!> <div style="width: 100%;“> <span style="float: right;color: Red; cursor: pointer" onclick="ShowHidden(''<%#Eval("GRNLot") %>'',event)">显示 <!-说明:上面代码重点在于 ShowHidden(''<%#Eval("GRNLot") %>'',event),其中 <%#Eval(“GRNLot”) %>为动态获取所点击的层名称-!> </span> </div> <!-显示/隐藏子网格的链接完成-!> <!-将子网格放在一个层中,以执行Javascript的 ShowHidden事件-!> <div style="display:none;" id="div<%#Eval("GRNLot") %>"> <!-说明:该层中的 display:none;即指定该层初始化为隐藏。id="div<%#Eval("GRNLot") %>"则为层的名称,且是根据父网格所点击行的 GRNLot 列 动态指定!-> <asp:GridView ID="LotGrid" runat="server"> <Columns> <asp:BoundField DataField="LotNM" HeaderText="批号" ReadOnly="true"/> <asp:BoundField DataField="Qty" HeaderText="数量" ReadOnly="true"/> </Columns> </asp:GridView> </div> </ItemTemplate> </asp:TemplateField> <!-子网格设置完成-!> </Columns> </asp:GridView> 子网格的显示和隐藏事件 <script type="text/javascript"> function ShowHidden(sid,ev) {<!-说明:sid 即为所父网格中所点击行而相关的层-!> ev = ev || window.event; var target = ev.target || ev.srcElement; var oDiv = document.getElementById("div" + sid); oDiv.style.display = oDiv.style.display == "none"?"block":"none";<!-显示或隐藏指定的层-!> target.innerHTML = oDiv.style.display == "none"?"显示":"隐藏";<!-根据显示或隐藏动作而的提示-!> } </script> 上面代码放在 aspx 文件的 <head>与</head>之间即可。 子网格数据绑定(点击父网格时触发) protected void ProdGrid_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { GridView LotGrid = (GridView)e.Row.FindControl("LotGrid");<!-寻找名称为LotGrid的子网格并赋值给 LotGrid 的 GridView 对象-!> if (LotGrid != null) { string strGRNLot = ProdGrid.DataKeys[e.Row.RowIndex][0].ToString();<!-获取父网格所点击行的的 DataKeyNames 参数,本案例只指定了 GRNLot。-!> Session["strSqlC"] = "select * from WMS_CellCheckLot where GRNLot =''" + strGRNLot + "'' and UserCodeNM=''" + Session["Cell"].ToString() + "''"; Modules shareDispose = new Modules(); <!-根据查询语句获取 DataSet 类型的值 -!> DataSet ds = shareDispose.getGridData(Session["strSqlC"].ToString()); LotGrid.DataSource = ds.Tables[0].DefaultView;<!-指定数据源-!> LotGrid.DataBind();<!-绑定数据源-!> } } } 下面是运行效果图 因本程序运行在 PDA上,故页面比普通WEB 页面小。 |