如何以编程方式查找和扩展 Telerik RadGrid 中的特定行?

How can I programatically find and expand a particular row in a Telerik RadGrid?

如何实现以下要求?

根据 queryString 中的值,请求的记录必须展开到其 DetailView 中。

此示例使用 Entity Framework 6 来访问数据。这意味着 RadGrid 的 pageSize、pageIndex 和排序信息必须保留在 EF 对数据库的调用中。

当您到达包含 RadGrid 的页面时,让我们假设以下 URL。

    http://localhost:61878/search?pageindex=8&orderid=2871517&pagesize=50
  1. RadGrid 声明性标记如下所示。

    <telerik:RadGrid ID="OrdersMasterGrid" runat="server"
            AllowPaging="True"
            AllowSorting="True"
            AutoGenerateColumns="False"
            OnNeedDataSource="GridOnNeedDataSource"
            OnPreRender="GridPreRender">
    
  2. 那么 PageLoad 看起来像这样。这在 RadGrid 的 OnNeedDataSource 事件之前触发,因此设置正确的 pageindex 和 pagesize 很重要,因为该信息将一直流向数据库。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            OrderID_QueryString = Request.QueryString.GetValue<string>("orderid");
                OrdersMasterGrid.MasterTableView.CurrentPageIndex = Request.QueryString.GetValue<int>("pageindex");
                OrdersMasterGrid.MasterTableView.PageSize = Request.QueryString.GetValue<int>("pagesize");
        }
    
  3. OnPreRender 事件期间以编程方式扩展正确的行。
    GridPreRender 事件处理程序如下所示:

    protected void GridPreRender(object sender, EventArgs e)
    {
        foreach (object gridDataItem in OrdersMasterGrid.MasterTableView.Items)
        {
            if (gridDataItem is GridDataItem)
            {
                GridDataItem gdi = gridDataItem as GridDataItem;
                if (gdi["OrderID"].Text == OrderID_QueryString)
                {
                    gdi.Expanded = true;
                    break;
                }
            }
        }
    }
    

结论:虽然这个例子使用了queryString,但使用ViewData、ViewBag或其他透明机制可能会更好。这种方法的缺陷是,如果用户决定为页面添加书签,当页面大小为 50 时,当请求的 orderid 不存在于 EF6 为第 8 页返回的数据中时,它最终将停止工作。