C# WebForm. RadControls Grid嵌套Grid时,父Grid数据行上的OnClientClick动作访问子Grid中的数据的Javascript方法。

时间:2022-09-08 12:16:47

C# WebForm. RadControls Grid嵌套Grid时,父Grid数据行上的OnClientClick动作访问子Grid中的数据的Javascript方法。见下图:

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. 可是没找着.