代码之家  ›  专栏  ›  技术社区  ›  André Haupt saber safavi

带LinqDataSource的ASP.NET GridView:记住排序、分页和Where参数状态

  •  0
  • André Haupt saber safavi  · 技术社区  · 17 年前

    我使用的是带有LinqDataSource的标准GridView。用户可以使用stock standard stuff对网格进行排序和分页。搜索条件(WhereParameters)也可用于过滤结果。这非常有效,但是当导航离开页面时,状态显然会丢失。

    因此,一种捕获排序和分页状态以及where参数值的通用机制将非常有用。然后,用户可以将这些值添加到会话中,并在用户导航回页面时恢复它们。

    任何帮助都将不胜感激。

    我的代码如下:

    <asp:GridView ID="dataGridView" runat="server" 
            AllowPaging="True" 
            AllowSorting="True" 
            AutoGenerateColumns="False" 
            CssClass="GridView"
            DataSourceID="linqDataSource"
            PageSize="20">
        <Columns>
            <asp:BoundField 
                HeaderText="Name" 
                DataField="Name" 
                SortExpression="Name" />
            <asp:TemplateField 
                HeaderText="Province" 
                SortExpression="Province.Name">
                <ItemTemplate>
                    <%# Eval("Province.Name")%></ItemTemplate>
                </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:LinqDataSource ID="linqDataSource" runat="server" 
        ContextTypeName="DataContext" 
        TableName="Schools"
        EnableUpdate="True" 
        EnableDelete="True"
        Where="Name.Contains(@Name) && (ProvinceID == @ProvinceID)">
        <WhereParameters>
            <asp:ControlParameter 
                Name="Name" 
                DefaultValue="" 
                ControlID="tbName" 
                Type="String" 
                ConvertEmptyStringToNull="False" />
            <asp:ControlParameter 
                Name="ProvinceID" 
                DefaultValue="" 
                ControlID="ddlProvince" 
                Type="Int32" />
        </WhereParameters>
    </asp:LinqDataSource>
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   MikeSullivan    16 年前

    您是否考虑过挂接gridviews OnDataBound事件并将适当的gridview属性存储在cookie中?然后,您可以点击非回发页面加载事件上的cookie,将gridview恢复到用户留下它的大约*位置。

    • 大约是因为gridview可能与用户不在时对源数据执行的任何CRUD操作略有不同。

    无论如何,这里有一些示例代码。

    protected void gvCountryList_DataBound(object sender, EventArgs e)
    {
      // Store gvCountryList Gridview Sort, PageIndex, and PageSize info 
      //   in a cookie so that we can redisplay same grid position next 
      //   time they visit page. 
      HttpCookie aCookie = new HttpCookie("MaintainCountries");
      aCookie["SortExp"] = gvCountryList.SortExpression.ToString();
      aCookie["SortDir"] = gvCountryList.SortDirection.ToString();
      aCookie["PageIndex"] = gvCountryList.PageIndex.ToString();
      Response.Cookies.Add("aCookie");
    )
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
    
            //Grab the cookies
            if (Request.Cookies["MaintainCountries"] != null)
            {
                if ((Request.Cookies["MaintainCountries"]["SortExp"] != null)
                 && (Request.Cookies["MaintainCountries"]["SortDir"] != null)
                 && (Request.Cookies["MaintainCountries"]["PageIndex"] != null))
                {
                    SortDirection srtDir = SortDirection.Ascending;
                    if (Request.Cookies["MaintainCountries"]["SortDir"].ToUpper() == "DESCENDING")
                        srtDir = SortDirection.Descending;
                    gvCountryList.Sort(Request.Cookies["MaintainCountries"]["SortExp"].ToString(), srtDir);
                    gvCountryList.PageIndex = Convert.ToInt32(Request.Cookies["MaintainCountries"]["PageIndex"].ToString());
                }
            }
        }
    }
    

    也许有比饼干更好的方法。

    我欢迎来自社区的批评和反馈。我认为自己是一个.NET Neb,所以如果有人看到潜在的问题或危险,请提出你的想法。

    迈克

        2
  •  0
  •   Mike    17 年前

    Session["_page"] = _currentPage;
    Session["_sortColumn"] = _currentSortColumn;
    Session["_sortDir"] = _currentSortDir;
    

    或者你可能会变得棘手,并将其粘贴到用户配置文件中。然后在页面上加载这些值。不利的一面是,如果有人导航离开,半小时后回来,他们会回到页面上,等等。如果您想让它们离开,比如转到详细信息表单,然后返回,只需将值传递到下一页。然后可以返回查询字符串上的值或类似的内容。

    享受。