ASP.NET GridView与LinqDataSource:记住排序,分页和WhereParameters状态
我用一个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>
安迪,
你有没有考虑钩住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
看起来很不错!感谢你的回答。现在有点淹没,但我很快就会尝试并回复你。 – 2010-01-14 11:36:37
嗯,丑陋的方式是使用会话,并给它要么MAJIC字符串或定义某处的价值为他们
Session["_page"] = _currentPage;
Session["_sortColumn"] = _currentSortColumn;
Session["_sortDir"] = _currentSortDir;
或者你可以变得棘手,并将其粘贴在用户配置文件中。然后将这些值加载到page_load或类似的东西上。缺点是,如果有人航行,半小时后回来,他们又回到了他们最后的页面等等。如果您正在寻找它们来导航,就像一个细节表单,然后返回,只需将这些值传递到下一页。然后你可以返回查询字符串的值或类似的东西。
享受。
感谢您的回答,但不是真的我以后。我需要一些通用的方法来连接OnSorting和OnPageIndexChanging方法来保存排序和分页信息。我还需要一种方法来存储WhereParameters。当用户返回页面时,我需要一种方法来恢复这些保存的值。 – 2009-10-07 09:30:47
是你的gridview在updatepanel中吗? – 2009-10-07 04:11:34
是的。我已经排除了部分代码。代码起作用。只是当用户返回页面时,我想恢复“页面视图”。 – 2009-10-07 09:27:29