【问题标题】:ASP.NET GridView with LinqDataSource: Remember Sorting, Paging and WhereParameters state带有 LinqDataSource 的 ASP.NET GridView:记住排序、分页和 WhereParameters 状态
【发布时间】:2009-10-07 01:23:24
【问题描述】:

我正在使用带有 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>

【问题讨论】:

  • 你的网格视图在更新面板中吗?
  • 是的。我已经排除了那部分代码。该代码有效。只是我想在用户返回页面时恢复“页面视图”。

标签: asp.net linq session gridview state


【解决方案1】:

安迪,

您是否考虑过挂钩到 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());
            }
        }
    }
}

也许有比 cookie 更好的方法。

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

迈克

【讨论】:

  • 看起来很有希望!感谢你的回答。目前有点忙,但我会尽快尝试并回复您。
【解决方案2】:

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

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

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

享受吧。

【讨论】:

  • 感谢您的回答,但并不是我真正想要的。我需要一些通用的方法来连接 OnSorting 和 OnPageIndexChanging 方法来保存排序和分页信息。我还需要一种方法来存储 WhereParameters。当用户返回页面时,我需要一个方法来恢复这些保存的值。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2012-04-27
  • 2012-11-29
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多