0

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

2 に答える 2

0

アンディ、

gridviews OnDataBoundイベントにフックして、適切なgridview属性をCookieに保存することを検討しましたか?次に、Non PostBack PageLoadイベントでそのCookieをタップして、グリッドビューをユーザーが残した場所にほぼ*復元できます。

  • グリッドビューは、ユーザーが不在のときに他のアクティビティから発生したソースデータに対する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の初心者だと思っているので、誰かが潜在的な問題や危険を見つけた場合は、考えを述べてください。

マイク

于 2010-01-09T15:15:11.460 に答える
0

まあ、醜い方法は、セッションを使用して、魔法の文字列を与えるか、それらの値をどこかに定義することです

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

または、トリッキーになってユーザープロファイルに貼り付けることもできます。次に、page_loadなどに値をロードします。欠点は、誰かが離れて移動した場合、30分後に戻ってきた場合、最後にいたページに戻った場合などです。詳細フォームのように、離れて移動するためにそれらを探している場合は、戻って、値を次のページに渡すだけです。次に、クエリ文字列などの値を使用して戻ることができます。

楽しみ。

于 2009-10-07T03:10:40.977 に答える