0

わかりました、私は時々少し木のアヒルになることができるので、私に耐えてください...

asp.netに何千ものレコードをプルバックするグリッドビューがあります。これは、パフォーマンスの面を除けば、すべてうまくいっています。Gridviewをデータセットにバインドしていますが、これによりクエリ内のすべてのレコードがプルバックされます。これを変更して、gridviewが現在表示しているレコードのみをプルバックし、ユーザーが次のページに移動すると、次のデータのチャックなどを取得するようにします。

以下は、通常、グリッドビューをバインドし、ページングと並べ替えを処理する方法です。これは、データ量が少ない場合は非常にうまく機能しますが、データ量が多い場合はあまりうまくいきません。私はSubSonicをDALとして使用しています。これはかっこいいです。上記のページングを実現するための最善の方法について、誰かが私を正しい方向に向けることができますか?

前もって感謝します...

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);
}
4

3 に答える 3

1

classのFill()メソッドにDbDataAdapterは、まさにこの目的のために便利なオーバーロードがあります。

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

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

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

于 2009-07-17T07:47:09.613 に答える
0

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

この戦略は効果的であり、18 列で最大 300,000 行までテストされています。利点の 1 つは、データのページングがデータベースに依存しないことです。データベースに再度アクセスする代わりに、バッファー (DataTable の場合もあります) に対して並べ替えを実行することもできます。

詳細については、このリンクをたどってください。お役に立てれば。

于 2009-09-20T15:05:40.080 に答える
0

どのバージョンの ASP.NET を使用していますか? .NET 3.5 の ListView に付属する DataPager コントロールがあります。system.web.ui.webcontrols.datapager を参照してください

SubSonic はページングもサポートしています。クエリで Paged メソッドをインラインで呼び出す必要があります。サブソニック ページングを参照してください

于 2009-07-17T08:02:57.553 に答える