C# WebForm. RadControls Grid嵌套Grid时,父Grid数据行上的OnClientClick动作访问子Grid中的数据的Javascript方法。见下图:
具体要求是点完Calulate 之后,要计算统计其下面子层中的所有数量总和存入到当前行的TotalQty中.
.aspx页面内容如下:
<telerik:RadGrid ID="gvProduct" runat="server" Skin="Outlook" Width="700px" AutoGenerateColumns="False" GridLines="None" AllowPaging="True" OnNeedDataSource="gvProduct_NeedDataSource" onitemcommand="gvProduct_ItemCommand" ondetailtabledatabind="gvProduct_DetailTableDataBind" OnItemCreated="gvProduct_ItemCreated" > <MasterTableView DataKeyNames="ProductID" HierarchyLoadMode="ServerOnDemand" > <Columns> <telerik:GridTemplateColumn HeaderText="Seq." UniqueName="gvShip_Seq"> <ItemTemplate> <%# (Container.ItemIndex + 1)%> <asp:HiddenField ID="hfID" runat="server" Value='<%# Eval("ProductID") %>' /> </ItemTemplate> </telerik:GridTemplateColumn> <telerik:GridBoundColumn HeaderText="客户名称" DataField="oos_prodalias" UniqueName="gvShip_oos_name" > </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="ERPNO" DataField="ERPNO" UniqueName="gvShip_oos_erpno" > </telerik:GridBoundColumn> <telerik:GridTemplateColumn HeaderText="TotalQty" UniqueName="TotalQty"> <ItemTemplate> <asp:TextBox ID="txtTotalQty" runat="server" ></asp:TextBox> </ItemTemplate> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn> <ItemTemplate> <asp:Button ID="btnCalc" runat="server" Text="Calculate" CommandName="Calculate" CommandArgument='<%# Eval("ProductID") %>' OnClientClick=" return calculate(this)" meta:resourcekey="btnModifyResource1" /> </ItemTemplate> </telerik:GridTemplateColumn> </Columns> <DetailTables> <telerik:GridTableView DataKeyNames="ItemRowID" Name="Details" Width="500px" runat="server" > <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="ProductID" MasterKeyField="ProductID" /> </ParentTableRelation> <Columns> <telerik:GridTemplateColumn > <ItemTemplate> <asp:HiddenField ID="hfprodId" runat="server" Value='<%# Eval("ProductID") %>' /> </ItemTemplate> </telerik:GridTemplateColumn> <telerik:GridBoundColumn HeaderText="ItemRowID" DataField="ItemRowID" UniqueName="ItemRowID"> </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="OrderType" DataField="OrderType" UniqueName="OrderType"> </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="SKU" DataField="SKU" UniqueName="SKU" > </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="Subseason" DataField="Subseason" UniqueName="Subseason" > </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="OrderQty" DataField="OrderQty" UniqueName="OrderQty" > </telerik:GridBoundColumn> <telerik:GridBoundColumn HeaderText="RealQty" DataField="RealQty" UniqueName="RealQty" > </telerik:GridBoundColumn> <telerik:GridTemplateColumn> <ItemTemplate> <asp:TextBox ID="txtLineQty" runat="server" Text='<%# Eval("ProduceQty") %>' ></asp:TextBox> </ItemTemplate> </telerik:GridTemplateColumn> </Columns> </telerik:GridTableView> </DetailTables> </MasterTableView> <ClientSettings> <Selecting AllowRowSelect="True" /> </ClientSettings> </telerik:RadGrid> </fieldset> </fieldset> </form> </body> </html> <script language="javascript" type="text/javascript"> function calculate(obj) { debugger var _objdata = $find("<%= gvProduct.MasterTableView.ClientID %>"); var _rows = _objdata._element.rows.length; for (var i = 1; i < _rows; i++) { if (_objdata._element.rows[i].childNodes.length == 2) { var objDetail = document.getElementById(_objdata._element.rows[i].childNodes[1].childNodes[0].id) //取出子层的第一个节点值,判断是不是属于当前行的子层 var _prodId = objDetail.childNodes[2].childNodes[0].cells[0].firstChild.value; } } //_objdata._data._columnsData.length 15 从0开始; _objdata._element.rows.length = 5 从第1个开始 } </script>
1.在此我们设置父层的数据行的列数不要为2,则如果 _objdata._element.rows[i].childNodes.length = 2 则说明这一行是Detail 表。
2.然后取出此Detail子表: objDetailId = document.getElementById(_objdata._element.rows[i].childNodes[1].childNodes[0].id)
3. 然后取出此Detail的Key值是不是所要的。
--objDetailId.childNodes[2].childNodes.length 表示Detail表里面有多少行数据,从0开始计数
--objDetail.childNodes[2].childNodes[0].cells.length 表示列数。
比如:
objDetail.childNodes[2].childNodes[0].cells[0].firstChild.nodeValue 代表第一个节点的值。
objDetail.childNodes[2].childNodes[0].cells[6].firstChild.value 代表此节点为textbox控件的值。
这是我找到的比较笨的方法.我想应该存在某个方法可以直接通过父表的id得到子表的id. 可是没找着.