1

チケットデータをロードするグリッドビューがあります。ユーザーの操作に応じて、このグリッドビューはさまざまな sqldatasources を読み込み、データを再表示します。

グリッドビューのマークアップは次のとおりです。

<X:GridViewX ID="gvxTaskList" runat="server"
    AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
    Width="100%" Height="100%" CssClass="tablestyle"
    OnRowCreated="gvxTaskList_RowCreated"
    OnPageIndexChanging="gvxTaskList_PageIndexChanging"
    OnSorting="gvxTaskList_Sorting">

だから、私には2つの問題があります。

まず、並べ替えイベントがまったく機能しません。データテーブルで null を取得します。コード:

protected void gvxTaskList_Sorting(object sender, GridViewSortEventArgs e)
{
    try
        {
            System.Data.DataTable dataTable = gvxTaskList.DataSource as  
                                                  System.Data.DataTable;

            if (dataTable != null)
            {
                System.Data.DataView dataView = new System.Data.DataView(dataTable);
                dataView.Sort = e.SortExpression + " " +   
                                    ConvertSortDirectionToSql(e.SortDirection);

                gvxTaskList.DataSource = dataView;
                gvxTaskList.DataBind();
            }
        }
        catch (Exception ex)
        {
        }
    }

    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        try
        {
            switch (sortDirection)
            {
                case SortDirection.Ascending:
                    newSortDirection = "ASC";
                    break;

                case SortDirection.Descending:
                    newSortDirection = "DESC";
                    break;
            }                
        }
        catch (Exception ex)
        {
        }
        return newSortDirection;
    }     

if (dataTable != null) で失敗するのは、それが null であるためです。

2 番目の問題は、ページングです。グリッドビューを最初にロードするとき、ページングは​​問題ありません。2 ページ分のデータ オンロードがあります。エラーなしで一日中ページを前後に移動できます。問題は、データソースを変更して 3 ページのデータを戻す場合です。最初のページからすぐに 3 ページをクリックしようとすると、前のデータ (2 ページ分) がリロードされます。どんな助けでも大歓迎です。

4

1 に答える 1

2

私は直接答え始めましたが、むしろこれは思考の練習になると思います. コードを少し実行して、何をしているかを見てください。

  1. グリッドからデータを引き出す
  2. データを並べ替える
  3. データをグリッドにバインドします

良くないパターンですよね?なんで?NULL 以外の値を取得した場合は、既にフォームがバインドされているため、データバインドが爆発します。そして、NULL を取得すると、ソートできません。これは、あなたが経験していることです。

より良いパターンは、データの概念をそれを表示するコンテナーから分離することです (事実上、ドメイン モデル (この場合はデータテーブルとして) を UI 要素から分離します)。これは、毎回一方向にバインドすることを意味します。

どのように?データを取得します。単に調整するだけの場合 (たとえば、同じデータ、別の並べ替えなど) は、投稿間でサーバーにコピーを保存できます (セッション中は 1 つの例ですが、他の手段もあります)。その後、データをソートしてバインドできます。ページングの場合は、次のセットとバインドを要求します。

Web はステートレスであるため、状態のように見えるハリー・ポッターの魔法に依存していないという考えです。代わりに、ステートレスを想定し、毎回フローを制御します。

さて、Allov は、さらに考えさせる興味深いアイデアを思いつきました。質問に完全に関連しているとは思いませんが、Web ページの流れを理解するのに非常に役立ちます。毎回 Page_Load でロードする場合はデータがありますが、現実的には、ポストバック以外のイベント以外に Page_Load を使用するのは悪いパターンです...何かが行われない限り、a) ページがロードされるたびに [より可能性が高い] またはb) ポストバックが発生するたびに [イベント ハンドラーがあるため、ほとんどありません]。

これが意味するのは、Get Page.PostBack == false は、Page_Load からロードし、他のすべてをイベ​​ントで処理する場合です。

Sort イベントでこれを使用していますが、GridView からデータをプルすることを期待しています。つまり、データが既にバインドされていることが期待されます。ただし、既にバインドされている場合は、バインドするためにクリアする必要があり、場合によってはそれが不可能になることさえあります。この場合、null を取得しているので幸運です。つまり、バインドの上にバインドしていないことを意味します (痛い!!!)。並べ替えメソッドの引数は、ユーザーの期待を判断するのに役立ちますが、データを自分で制御してバインドする必要があります。これは毎回データベースにアクセスすることも、「キャッシュ」してキャッシュからバインドすることもできます。並べ替えなどの項目が多い場合は、「キャッシュ」が最適です。セッションは、ページ ヒット間で「キャッシュ」できる場所の 1 つです。

これが理にかなっていることを願っています。

于 2012-10-17T19:39:26.117 に答える