从Item Template按钮中获取RadGrid选定行的索引

8

我正在使用Telerik控件进行项目开发。我正在尝试弄清楚如何在ItemTemplate按钮单击事件中获取选定行的索引,就像下面的标记一样:

<telerik:RadGrid ID="RadGrid1" runat="server" AllowFilteringByColumn="True" 
    DataSourceID="cusGrid" GridLines="None" Skin="Default" AllowPaging="True" DataKeyValue="CustomerID" 
    PageSize="500" AllowMultiRowSelection="True" ShowStatusBar="true" >
        <MasterTableView AutoGenerateColumns="False" DataKeyNames="CustomerID" DataSourceID="cusGrid">
            <RowIndicatorColumn>
                <HeaderStyle Width="20px"></HeaderStyle>
            </RowIndicatorColumn>
            <ExpandCollapseColumn>
                <HeaderStyle Width="20px"></HeaderStyle>
            </ExpandCollapseColumn>
            <Columns>
                <telerik:GridTemplateColumn UniqueName="CheckBoxTemplateColumn">
                    <ItemTemplate>
                        <asp:Button runat="server" Text="Select" OnClick="SelRecord" />
                    </ItemTemplate>
                </telerik:GridTemplateColumn>
    ...

通常情况下,对于一个GridView,我会像这样做:
protected void SelRecord(object sender, EventArgs e)
{
    var gRow = (GridViewRow)(sender as Control).Parent.Parent;
    var key = string.Empty;
    if (gRow != null) { key = gRow.Cells[0].Text; }
}

什么是Telerik控件的等效物?
5个回答

8
使用CommandArgument,并使用OnCommand代替OnClick来获取行索引:
<asp:Button ID="Button1" runat="server" CommandArgument='<%#Container.ItemIndex%>' OnCommand="Button1_Command" ... />

代码后台:

protected void Button1_Command(object sender, CommandEventArgs e)
{
    GridDataItem item = RadGrid1.Items[(int)e.CommandArgument];
}

2
同意这种方法,这绝对是最简单的方式。 - Paul Sullivan
请注意将其转换为整数尝试: RadGrid1.Items[int.parse((e.CommandArgument.ToString())]; - Mohamad Mahmoud Darwish

3
你可以使用 CommandName="" 代替 OnClick
同时在 telerik:RadGrid 标签中添加 onitemdatabound="RadGrid1_ItemDataBound"
然后在代码后台中:
protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
        GridDataItem dataItem = e.Item as GridDataItem;

                int selectedRowIndex = dataItem.RowIndex;
    }
}

我看到这被接受为答案,但您能否请解释一下这是如何解决问题的? - Brad

2

Telerik文档中了解到,您需要:

var gRow = ((sender as Button).NamingContainer as GridItem).Selected;

虽然您没有问及这段代码,但我认为这段代码:

if (gRow != null) { key = gRow.Cells[0].Text; }

这可能会引发麻烦。

虽然标记和代码后台始终高度耦合,但如果直接引用单个单元格,则会产生代码异味。我猜想你想从你的 ItemTemplate 中的ASP Button 中提取“ Select”。

你能给你的 Button 分配一个ID, 并调用 FindControl(“buttonID”) 来获取所需数据吗? 这将有助于保持您的代码更易于维护和阅读。


1
 <telerik:GridTemplateColumn UniqueName="IndexRow" HeaderText="#">
                            <ItemTemplate>
                                <%#Container.ItemIndex + 1%>
                            </ItemTemplate>
                        </telerik:GridTemplateColumn>

谢谢,这正是我在寻找的...请不要更改后台代码,做同样的事情 :) - Jahangeer

0

在按钮点击事件中类似这样的代码应该可以工作

        foreach (GridDataItem item in RadGrid1.SelectedItems)
        {
            GridDataItem item = (GridDataItem)RadGrid1.SelectedItems;
            var key = string.Empty;
            key = item.ItemIndex;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接