0

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

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

任何帮助将非常感激。

我的代码如下:

<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>
4

2 回答 2

0

好吧,丑陋的方法是使用会话并给它一个majic字符串或在某个地方定义它们的值

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

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

享受。

于 2009-10-07T03:10:40.977 回答
0

安迪,

您是否考虑过挂钩到 gridviews OnDataBound 事件并将适当的 gridview 属性存储在 cookie 中?然后,您可以在 Non PostBack PageLoad 事件上点击该 cookie 以将 gridview 恢复到用户离开它的大致位置。

  • 大约是因为根据用户离开时其他活动对源数据进行的任何 CRUD 操作,gridview 可能会有所不同。

如果您希望页面长时间记住其状态,可以使用 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());
            }
        }
    }
}

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

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

麦克风

于 2010-01-09T15:15:11.460 回答