从 JavaScript 获取 RadGrid 上 RadRating 的关联 ID

Obtain the associated Id for RadRating on RadGrid from JavaScript

我正在使用 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() 方法根本不 return 该行。我看到的是红鲱鱼。 get_parent returns 是网格的父控件,然后查找它属于哪些行我找到了两个选项:

1) 获取HTML元素,遍历父节点直到找到行,得到rowIndex。并使用该索引从网格中获取相应的 DataItem

var rowIndex = controlRating.get_element().parentNode.parentNode.rowIndex - 1;

2) 订阅grid的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

}