Пейджинг больших объемов данных в Gridview - PullRequest
0 голосов
/ 17 июля 2009

Хорошо, пожалуйста, потерпите меня, потому что иногда я могу быть немного деревянной уткой ...

У меня есть сетка в asp.net, которая будет собирать тысячи записей. Это все хорошо, кроме аспекта производительности вещей. Я привязываю свой 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);
}

Ответы [ 3 ]

1 голос
/ 17 июля 2009

Метод Fill() класса DbDataAdapter имеет удобную перегрузку для этой цели:

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

В этой перегрузке вы можете указать номер записи, с которого нужно начать, и максимальное количество записей, которое нужно извлечь из этой начальной точки. Это позволяет вам извлекать только подмножество записей из источника данных на основе текущего индекса страницы. Все, что вам нужно отслеживать, это текущий индекс записи, который отображается.

Таким образом, вам потребуется изменить DAL для обеспечения этой перегрузки. Я не использовал SubSonic, поэтому я не могу сказать, существует ли эта функция в нем.

0 голосов
/ 20 сентября 2009

Одна вещь, которую вы можете сделать, это буферизовать данные на веб-сервере и направить ваши страницы данных в веб-браузер. Вы можете добиться этого с помощью GridView control и путем создания фонового потока, который извлекает данные из вашей базы данных для заполнения буфера с помощью SqlDataReader. Затем браузер извлекает страницы данных (200 строк первой страницы, секунды и т. Д.) Из веб-сервера, используя AJAX, пока все строки в буфере не будут переданы в браузер и сохранены в массиве строк JavaScript.

Я считаю, что эта стратегия эффективна и проверена на максимум 300 000 строк с 18 столбцами. Одним из преимуществ подкачки данных не зависит от вашей базы данных. Вы даже можете выполнить сортировку по буферу (который может быть DataTable) вместо повторного обращения к базе данных.

Чтобы узнать больше, перейдите по этой ссылке. Надеюсь, это поможет.

0 голосов
/ 17 июля 2009

какую версию ASP.NET вы используете? Существует элемент управления DataPager, который поставляется с ListView в .NET 3.5 См. system.web.ui.webcontrols.datapager

SubSonic также поддерживает разбиение по страницам, вам следует вызывать метод Paged, встроенный в запрос. См. SubSonic Paging

...