2009-10-07 70 views
0

我用一个LinqDataSource标准的GridView。用户可以使用库存标准的东西对网格进行排序和翻页。搜索条件(WhereParameters)也可用于过滤结果。这样做效果很好,但是每当离开页面时,状态显然都会丢失。ASP.NET GridView与LinqDataSource:记住排序,分页和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> 
+0

是你的gridview在updatepanel中吗? – 2009-10-07 04:11:34

+0

是的。我已经排除了部分代码。代码起作用。只是当用户返回页面时,我想恢复“页面视图”。 – 2009-10-07 09:27:29

回答

0

安迪,

你有没有考虑钩住GridView的OnDataBound事件和在cookie中存储适当的gridview的属性?然后,您可以在Non PostBack PageLoad事件中点击该cookie以将gridview恢复到用户离开它的大约*。

  • 大概是因为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()); 
      } 
     } 
    } 
} 

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

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

Mike

+0

看起来很不错!感谢你的回答。现在有点淹没,但我很快就会尝试并回复你。 – 2010-01-14 11:36:37

0

嗯,丑陋的方式是使用会话,并给它要么MAJIC字符串或定义某处的价值为他们

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

或者你可以变得棘手,并将其粘贴在用户配置文件中。然后将这些值加载到page_load或类似的东西上。缺点是,如果有人航行,半小时后回来,他们又回到了他们最后的页面等等。如果您正在寻找它们来导航,就像一个细节表单,然后返回,只需将这些值传递到下一页。然后你可以返回查询字符串的值或类似的东西。

享受。

+0

感谢您的回答,但不是真的我以后。我需要一些通用的方法来连接OnSorting和OnPageIndexChanging方法来保存排序和分页信息。我还需要一种方法来存储WhereParameters。当用户返回页面时,我需要一种方法来恢复这些保存的值。 – 2009-10-07 09:30:47