我使用的是Telerik的ASP.NET AJAX库,RadGrid中的每一行都有一个RadRating元素,并且需要获取RadRating被评级的行的关联Id(但使用Javascript),但是get_parent()
方法返回的是网格引用,而不是行。
如何获取RadRating行的GridDataItem
?
以下代码有时有效,但并非总是有效。我做错了什么?
<script type="text/javascript">
(function(global,undefined) {
function OnClientRating(controlRating,args) {
var row = controlRating.get_parent();
var userId = row.getDataKeyValue("UserId");
}
global.OnClientRating = OnClientRating;
})(window);
</script>
<rad:RadGrid runat="server" ID="gridUsers" Skin="Hay"
EnableAJAX="False"
AutoGenerateColumns="False"
GridLines="Both"
Width="100%"
AllowSorting="True"
OnItemDataBound="Grid_ItemDataBound">
<MasterTableView DataKeyNames="UserId" ClientDataKeyNames="UserId">
<Columns>
<rad:GridTemplateColumn HeaderText="Name" HeaderStyle-Width="180px" ItemStyle-Width="180px">
<ItemTemplate>
<%# Eval("FullName")%>
</ItemTemplate>
</rad:GridTemplateColumn>
<rad:GridTemplateColumn HeaderText="Rating" HeaderStyle-Width="100px" ItemStyle-Width="100px">
<ItemTemplate>
<rad:RadRating ID="ratAppraiserRating" runat="server" ItemCount="5" Value='<%# Eval("AverageRating")%>'
SelectionMode="Continuous" Precision="Item" Orientation="Horizontal" OnClientRating="OnClientRating"
OnRate="RatRating_Rate" AutoPostBack="true" />
</ItemTemplate>
</rad:GridTemplateColumn>
</Columns>
</MasterTableView>
<ClientSettings>
<Scrolling UseStaticHeaders="false" ScrollHeight="240px" AllowScroll="true" />
<Selecting AllowRowSelect="false" />
<ClientEvents OnRowDblClick="selectRow" />
</ClientSettings>
</rad:RadGrid>
这就是我的发现。get_parent()
方法根本不返回该行。我看到的只是转移视线。get_parent
返回作为网格的父控件,然后为了找到它所属的行,我找到了两个选项:
1) 获取HTML元素并遍历父节点,直到找到行并获得rowIndex
。并使用该索引从网格中获得相应的DataItem
。
var rowIndex = controlRating.get_element().parentNode.parentNode.rowIndex - 1;
2) 订阅网格的OnRowMouseOver
事件,并保留DataGridItem
的引用,并在真正需要时使用它。
var currentDataItem = undefined;
function onRowMouseOver(sender, eventArgs) {
currentDataItem = eventArgs.get_gridDataItem();
}
更新:Telerik的人建议第三种选择
3)
function OnClientRating(sender, args) {
var parentTableView = sender.get_parent();
var rowID = $telerik.$(sender.get_element()).closest("tr")[0].id;
var rowIndex = rowID.split("__")[1];
var dataItem = parentTableView.get_dataItems()[rowIndex];
var someCellText = dataItem.get_cell("ColumnUniqueName").innerHTML;
// add custom logic here
}