使用LinqDataSource的ASP.NET GridView:记住Sorting,Paging和WhereParameters状态

时间:2009-10-07 01:23:25

标签: asp.net linq session gridview state

我正在使用带有LinqDataSource的标准GridView。用户可以使用库存标准内容对网格进行排序和分页。搜索条件(WhereParameters)也可用于过滤结果。这很有效,但是当离开页面时,状态显然会丢失。

因此捕获Sort和Pagining状态以及WhereParameter值的通用机制会很棒。然后,可以将这些值添加到会话中,并在用户导航回页面时恢复它们。

非常感谢任何帮助。

我的代码如下:

<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 个答案:

答案 0 :(得分:0)

嗯,丑陋的方式是使用会话并为其指定majic字符串或为其定义值

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

或者你可能会变得棘手,并将其粘贴在用户个人资料中。然后在page_load或类似的东西上加载值。不利的一面是,如果有人离开,半小时后回来,他们又回到了他们最后的页面等。如果您正在寻找他们导航,比如详细表格,那么回来,只需将值传递到下一页。然后,您可以返回查询字符串上的值或类似的值。

享受。

答案 1 :(得分:0)

安迪,

您是否考虑过挂钩网格视图OnDataBound Event并将相应的gridview属性存储在Cookie中?然后,您可以在Non PostBack PageLoad事件上点击该cookie,将gridview恢复到用户离开它的大约*。

  • 大致是因为在用户离开时,基于对来自其他活动的源数据的任何CRUD操作,网格视图可能有点不同。

如果您希望页面长时间记住其状态,则可以使用cookie过期属性。

无论如何......这是一些示例代码。

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());
            }
        }
    }
}

也许有一种比cookie更好的方法。

我欢迎并批评和反馈社区。我认为自己是.net newb,所以如果有人发现潜在的问题或危险,请提出你的想法。

麦克

相关问题