C# WebForm. RadControls Grid嵌套Grid时,父Grid数据行上的OnClientClick动作访问子Grid中的数据的Javascript方法。
Posted on 2011-03-23 18:06 David.guo的丹麦童话 阅读(604) 评论(0) 收藏 举报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. 可是没找着.
浙公网安备 33010602011771号