2009-07-17 12 views
0

[OK]を、私はいつでもアメリカオシのビットすることができて、ページング大量

私は戻って、多くを引っ張っされますasp.netでGridViewのを持っている...私と一緒に負担してください何千もの記録これは、物事のパフォーマンス面を除いて、すべてうまくいいです。私はデータセットに私のGridviewをバインドしており、これはクエリのすべてのレコードを取り戻します。私はこれを変更して、グリッドビューが現在表示しているレコードだけを取り戻し、ユーザーが次のページに移動して次のデータのチャックなどを取得するときに変更したい。

以下は、私のgridviewsとページングと並べ替えを処理します。これは小さなデータ量ではうまく動作しますが、大きなデータ量ではあまり効果がありません。私はDALとしてSubSonicを使用しています。上記のようにページングを達成する最良の方法について誰でも正しい方向に向けることができますか?事前に

おかげで...

public SortDirection SortDir 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
     { 
      ViewState["sortDirection"] = SortDirection.Ascending; 
     } return (SortDirection)ViewState["sortDirection"]; 
    } 
    set 
    { 
     ViewState["sortDirection"] = value; 
    } 
} 

DataSet ds = new DataSet(); 
DataView dv = new DataView(); 

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

private DataView BindGrid() 
{ 
    ds = new Query(AnthemWeb.DAL.Item.Schema).ExecuteDataSet(); 

    if (ViewState["sortExpr"] != null) 
    { 
     dv = new DataView(ds.Tables[0]); 
     dv.Sort = (string)ViewState["sortExpr"]; 
    } 
    else 
    { 
     dv = ds.Tables[0].DefaultView; 
    } 

    return dv; 
} 

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    GridView1.PageIndex = e.NewPageIndex; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    string stExp = e.SortExpression; 
    string stDir = string.Empty; 
    if (SortDir == SortDirection.Ascending) 
    { 
     SortDir = SortDirection.Descending; 
     stDir = "DESC"; 
    } 
    else 
    { 
     SortDir = SortDirection.Ascending; 
     stDir = "ASC"; 
    } 

    ViewState["sortExpr"] = e.SortExpression + " " + stDir; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int selectedRowIndex; 
    selectedRowIndex = GridView1.SelectedIndex; 
    GridViewRow row = GridView1.Rows[selectedRowIndex]; 
    string ID = row.Cells[0].Text; 

    Response.Redirect("customer-details.aspx?ID=" + ID, false); 
} 

答えて

0

どのバージョンのASP.NETを使用しますか? は亜音速でもページングをサポートしていsystem.web.ui.webcontrols.datapager

は、クエリでページングされたメソッドをインラインに呼び出す必要があります参照してください。NET 3.5 でListViewコントロールが付属してDataPagerコントロールがあります。 SubSonic Paging

+0

返信いただきありがとうございます。私はSubsonicでページメソッドを使用しようとしていますが、私が今行っている問題は、gridviewのページャコントロールが表示されていないということですか? 私はコレクションを作成し、これにグリッドビューをバインドしています。私は.Paged(pageIndex、6)を渡しています。 allowpagingはgridviewに設定されており、GridView1_PageIndexChangingイベント(BindPagedData(e.NewPageIndex、6);)を処理するメソッドがあります。ページングを通過するコントロールは表示されません。テスト用に120レコードあります。 私は完全に間違った方法でこれについて行きますか?何か助けてくれてありがとう。 – macou

1

DbDataAdapterクラスのFill()方法は、この非常に目的のために便利なオーバーロードがあります。

public int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable) 

このオーバーロードでは、あなたがにレコード番号を提供することができます開始位置とその開始点から取得する最大レコードを指定します。これにより、現在のページインデックスに基づいて、データソースからレコードのサブセットのみを取得できます。追跡する必要があるのは、表示されている現在のレコードインデックスだけです。

このオーバーロードを提供するには、DALを変更する必要があります。私はSubSonicを使用していないので、その中にその機能が存在するかどうかはわかりません。

0

Webサーバーにデータをバッファし、データページをWebブラウザにストリーミングすることができます。 GridViewコントロールを使用して、データベースからデータを取得してSqlDataReaderを使用してバッファを満たすバックグラウンドスレッドを作成することで、これを達成できます。次に、バッファ内のすべての行がブラウザに送信され、JavaScript文字列配列に格納されるまで、ブラウザはAJAXを使用してWebサーバーからデータページ(最初のページから200ページ目までの200行)を取得します。

私はこの戦略が効果的であり、18列の最大300,000行までテストされています。 1つの利点は、データベースに依存しないデータをページングすることです。もう一度データベースにヒットするのではなく、バッファ(DataTable)にソートを実行することもできます。

To find out more, you can follow this link.これが役に立ちます。