5

私はこの質問をいくつかの方法で尋ねようとしました。何が起こっているのかを理解する必要があるため、答えるのが難しい質問です。

GridView を埋めるのはいつですか?


PostBackでないPage_Load場合、ニーブの答えは duringです。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
       DataSet ds = GetStuffToShow();
       GridView1.DataSource = ds;
       GridView1.DataBind();
    }
}

問題、ポストバックの場合、グリッドが満たされないことです。グリッドが塗りつぶされていないのは、グリッドのビューステートをオフにしたためです。

だから IsPostBack を見ないでください

ポストバックの有無にかかわらず、常にグリッドを埋める必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    DataSet ds = GetStuffToShow();
    GridView1.DataSource = ds;
    GridView1.DataBind();
}

これに関する問題は、ユーザーが列をソートすると、との両方のOnSortingにイベントが呼び出されることです。Page_InitPage_Load

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    DataSet ds = GetStuffToShow(e.SortExpression, e.SortDirection);
    GridView1.DataSource = ds;
    GridView1.DataBind();
}    

必要なデータベース クエリは 1 つだけでしたが、2 つのデータベース クエリを実行しました。

キャッシュは列の並べ替えに適しています

列の並べ替え中に無効なキャッシュを受け入れる場合は、他の操作でキャッシュを無効にする限り、セッション変数に格納できます。DataSet

問題は、OnSortingイベントが必要になった後に呼び出されることです ( Page_Load):

protected void Page_Load(object sender, EventArgs e)
{
    if (AGridViewOnSortingEventIsntBeingRaised)
    {
       DataSet ds = GetStuffToShow();

       StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);

       GridView1.DataSource = ds;
       GridView1.DataBind();
    }
}

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    DataSet ds = GetDataSetOutOfSessionSomehowThatDamnWellBetterBeThere();

    SomehowSortAReadOnlyDisconnectedDataSet(ds, e.SortExpression, e.SortDirection);

    GridView1.DataSource = ds;
    GridView1.DataBind();
}    

未知への恐怖

次に、GridView のビューステートをオフにしたため、まだ恐怖があります。asp:GridViewサーバーから(またはメモリから)再構築できる場合、読み取り専用に数十キロバイトのbase64エンコードが必要だとは思いません。

GridViewしかし、ページが最後にレンダリングされたときの状態に戻す義務があると思います。そして、私は前に Page_Load(つまり、中にPage_Init)それをしなければなりません。誰かがそう言ったので、私はこの恐怖を持っています。だから私はそれを

protected void Page_Init(object sender, EventArgs e)
{
    if (AGridViewOnSortingEventIsntBeingRaised)
    {
       DataSet ds = GetStuffToShow();

       StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);

       GridView1.DataSource = ds;
       GridView1.DataBind();
    }
}

これに関する問題はGetStuffToShow、ユーザーがテキスト ボックスに入力した内容に依存することです。Page_Init

とにかくダラダラしています。ここは暑すぎる。asp.netに対する私の他の 最近の 不満とは異なり、この質問が答えられることを願っています。

ボーナスリーディング

4

3 に答える 3

0

簡単な解決策はGridview.DataBind()Page.Pre_Renderイベントを呼び出すことです。これにより、ボタン/並べ替えのイベントを処理した後に呼び出されます。これは、リクエストごとに 1 回だけ呼び出すようにするための良い方法です。

わかりやすくするために、プロパティを介してデータセットにアクセスすることもお勧めします。これは、基本的"Store-The-Dataset-In-The-Session-Somehow-In-Case-They-Call-Sort-In-The-Future"に Set 部分でメソッドを呼び出し"Get-Data-Set-Out-Of-Session-That-Had-Better-Be-There"、Get 部分でメソッドを呼び出します。

于 2013-07-26T14:08:26.530 に答える
0

1 つは並べ替え式用、もう 1 つは並べ替え方向用の 2 つの非表示フィールドを追加することで、これらの値を使用して、ページの読み込み時に一度 GridView を設定し、Sorting イベントで並べ替えを更新できます (並べ替えコードは All から変更されます)。 -In-One コード フレームワーク GridView サンプル):

    protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = GetStuffToShow();
        GridView1.DataSource = ds;
        GridView1.DataBind();
    }

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        // If the sorting column is the same as the previous one, 
        // then change the sort order.
        if (SortExpression.Value.Equals(e.SortExpression))
        {
            SortDirection.Value = SortDirection.Value.Equals("ASC") ? "DESC" : "ASC";
        }
        // If sorting column is another column, 
        // then specify the sort order to "Ascending".
        else
        {
            SortExpression.Value = e.SortExpression;
            SortDirection.Value = "ASC";
        }

        var sortedView = new DataView(<convert your DataSet to a DataTable>)
            { Sort = string.Format("{0} {1}", this.SortExpression.Value, this.SortDirection.Value) };
        GridView1.DataSource = sortedView;

        GridView1.DataBind();
    }

SortDirection と SortExpression は隠しフィールドであることに注意してください。これは、DataSet のキャッシュにも適しています。

また、あなたが提起した Page_Init の問題については心配しません。これは、コントロールを動的に作成している場合にのみ適用されます。

于 2012-07-04T01:17:14.243 に答える