Select RadGrid 中只有一个 RadioButton,带有分页和服务器端的任何 PageSize 代码在 C# 中隐藏 ASP.NET

Select only one single RadioButton in RadGrid with Paging and any PageSize at Server Side Code behind in C# ASP.NET

检查/Select Rad Grid 或 Grid View 中只有一个 Radio Button with Paging and any PageSize at Server Side Code behind in C#

我的目标是在 telerik:RadGrid 内保持用户选择 asp:RadioButton 被选择/检查,即使在网格分页和任何 PageSize 相应的情况下也是如此。

我面临的挑战是无法为网格中每一行的每个 RadioButton 维护唯一组名。因此,我必须在后面的代码中处理此功能。

我是如何尝试在互联网上搜索解决方案的,我发现了一些 javascript 的答案,但我对这些答案并不满意。

<telerik:RadGrid ID="rgWithPaging" AllowPaging="True" CellSpacing="0" GridLines="None"
                AllowSorting="True" runat="server" AutoGenerateColumns="False"
                AllowFilteringByColumn="true" EnableLinqExpressions="false"
                PagerStyle-PageSizeControlType="RadDropDownList" PagerStyle-AlwaysVisible="true" Visible="true"
                OnNeedDataSource="rgWithPaging_NeedDataSource">
...........
    <telerik:GridTemplateColumn HeaderText="Check One" HeaderStyle-CssClass="gradient" AllowFiltering="false" HeaderStyle-Width="10%">
     <ItemTemplate>
      <asp:RadioButton ID="rbWPFileName" runat="server"/>
     </ItemTemplate>
    </telerik:GridTemplateColumn>
...........
</telerik:RadGrid>

我用服务器端代码得出的答案如下:

<telerik:RadGrid ID="rgWithPaging" AllowPaging="True" CellSpacing="0" GridLines="None"
                AllowSorting="True" runat="server" AutoGenerateColumns="False"
                AllowFilteringByColumn="true" EnableLinqExpressions="false"
                PagerStyle-PageSizeControlType="RadDropDownList" PagerStyle-AlwaysVisible="true" Visible="true"
                OnNeedDataSource="rgWithPaging_NeedDataSource" OnDataBound="rgWithPaging_OnDataBound">
...........
    <telerik:GridTemplateColumn HeaderText="Check One" HeaderStyle-CssClass="gradient" AllowFiltering="false" HeaderStyle-Width="10%">
     <ItemTemplate>
      <asp:RadioButton ID="rbWPFileName" runat="server" AutoPostBack="true" OnCheckedChanged="rbWPFileName_OnCheckedChanged"/>
     </ItemTemplate>
    </telerik:GridTemplateColumn>
...........
</telerik:RadGrid>

现在在代码隐藏中实现这一点我们只需要两个事件

OnCheckedChanged="rbWPFileName_OnCheckedChanged" and OnDataBound="rgWithPaging_OnDataBound"

在后面的代码中:

    protected void rbWPFileName_OnCheckedChanged(object sender, EventArgs e)
        {
            var rbtnSelected = sender as RadioButton;
            if (rbtnSelected == null) return;
            foreach (GridDataItem item in rgWithPaging.Items)
            {
                var radFileName = (RadioButton)item.FindControl("rbWPFileName");
                if (radFileName == null) return; 
                radFileName.Checked = rbtnSelected.ClientID == radFileName.ClientID;
                if (radFileName.Checked)
                {
                    var position = (rgWithPaging.PageSize*rgWithPaging.CurrentPageIndex) + item.ItemIndex;
                    Session["Position"] = position;
                }
            }
        }

protected void rgWithPaging_OnDataBound(object sender, EventArgs e)
    {
        if (Session["Position"] == null) return;
        var position = (int)Session["Position"];
        var pageIndex = position / rgWithPaging.PageSize;
        var itemIndex = position%rgWithPaging.PageSize;

        if (pageIndex == rgWithPaging.CurrentPageIndex)
        {
            foreach (GridDataItem item in rgWithPaging.Items)
            {
                var radFileName = (RadioButton)item.FindControl("rbWPFileName");
                if (radFileName == null) return;
                radFileName.Checked = itemIndex == item.ItemIndex;
            }
        }
    }

大功告成!!!享受..:-)