Подкачка данных сетки данных с использованием C #, Prev / Next не работает

#c# #asp.net #datagrid #paging

#c# #asp.net #datagrid #подкачка

Вопрос:

Хорошо, я искал везде и перепробовал почти все предложения, которые смог найти, и ПОКА НИЧЕГО не сработало. D: Вот моя проблема:

У меня есть DataGrid проблема с TemplateItems тем, что пользователь входит в два TextBoxes , которые заполняются данными после нажатия кнопки. Моя кнопка принимает две даты, которые пользователь вводит в два TextBoxes , и извлекает все записи между этими датами из a DataBase . Затем записи отображаются в DataGrid . Что мне нужно для этого DataGrid , так это разрешить подкачку по 10 строк на страницу. Все, что мне нужно, это ссылки Next и Prev для перехода по страницам, содержащим данные. Ссылки работают, но данные не меняются (Next не переходит на следующую страницу, данные остаются прежними). Я точно знаю, что Items между определенными датами существует более 10 записей, поэтому я знаю, что данные должны меняться в зависимости от того, на какой странице они находятся. Кроме того, кнопки Next кажутся бесконечными. Почему? Кто-нибудь, пожалуйста, помогите мне.

Теперь по какой-то причине, когда я получаю данные из базы данных, они начинаются с получения всех записей, но затем в них сохраняется только 10 (это количество, которое я хочу, чтобы страницы отображались одновременно). Данные никогда не показывают остальное, что должно быть… Почему?! D’:

Комментарии:

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

Ответ №1:

Задайте новый индекс страницы перед установкой источника данных.

 protected void dgArchive_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{

    if (source != null)
    {
        dgArchive.CurrentPageIndex = e.NewPageIndex;
        JSP_Extrusion_QCEntities ent = new JSP_Extrusion_QCEntities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString());
        DateTime start = Convert.ToDateTime(Start.Text);
        DateTime end = Convert.ToDateTime(End.Text).AddDays(1);
        AllDataSources ds = new AllDataSources();

        dgArchive.DataSource = ds.populateArchive(ent, start, end);
        dgArchive.DataBind();

    }
}
  

Кроме того, почему вы подключаете свои события к Page_Load? Вам не нужно этого делать, если вы делаете это в разметке.

Эти 3 строки:

     GetDateEntries.Click  = new EventHandler(GetDateEntries_Click);
    dgArchive.VirtualItemCount = 200;
    dgArchive.PageIndexChanged  = new DataGridPageChangedEventHandler(dgArchive_PageIndexChanged);
  

Должно быть объявлено в разметке. Вот как вы регистрируетесь в PageIndexChanged для вашей сетки из разметки.

 <asp:DataGrid ID="dgArchive" CssClass="data" AutoGenerateColumns="False" runat="server" AllowPaging="true" 
PageSize="10" EnableViewState="true" AllowCustomPaging="true" Visible="false"
OnPageIndexChanged="dgArchive_PageIndexChanged"
>
  

Вот пример из MSDN.

Комментарии:

1. 1: что populateArchive делать? Запрашивает ли это базу данных с параметрами диапазона страниц или просто фильтрует ее?

2. @JamesJohnson не знаю; Я взял это из его кода. Похоже, он привязывает datagrid к пользовательскому объекту (AllDataSources) и populateArchive является просто методом, который возвращает данные.

3. На самом деле не имеет значения, устанавливаете ли вы его на Page_Load или размещаете его в разметке. Все еще работает в любом случае. Page_Load просто позволяет мне видеть, что к чему и что где. Но я изменил его, чтобы посмотреть, изменило ли это, и это не так. Я проверил еще раз, и кажется, что когда данные заполняются, они заполняют только тот размер страницы, который есть. Между «dateA» и «dateB» 28 записей, но отображаются только первые 10, когда-либо. Они не меняются с помощью кнопки Next . :/

4. @SiSan Я с подозрением отношусь к этой строке в Page_Load GetDateEntries_Click =... . Установите точку останова GetDateEntries_Click и убедитесь, что она не срабатывает при КАЖДОМ ВОЗВРАТЕ СООБЩЕНИЯ. Потому что кажется, что это отменяет все, что делает событие PageIndexChanged .

5. populateArchive был моим собственным кодом для заполнения datagrid на странице архива. И я попробую. Это действительно то же самое, как если бы я просто поставил «onclick= GetDateEntries» на кнопку. Это ASP. Я надеюсь, что это не влияет на PageIndexChanged…

Ответ №2:

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

 <asp:DataGrid ID="DataGrid1" runat="server" OnPageIndexChanged="DataGrid1_PageIndexChange" ...>
  

Код за:

 protected void DataGrid1_PageIndexChange(object sender, DataGridPageChangedEventArgs e)
{
    DataGrid1.CurrentPageIndex = e.NewPageIndex;
    BindDataGrid();
}

private void BindDataGrid()
{
    DataGrid1.DataSource = GetSomeData();
    DataGrid1.DataBind();

    int total = dt.Rows.Count;
    int pSize = grdJobs.PageSize;
    int pIndex = grdJobs.CurrentPageIndex;

    if (total < pSize) 
        pSize = total;

    int start = (pSize * pIndex)   1;
    int end = (start   pSize) - 1;

    if (end > total) 
        end = total;

    lblTotalResults.Text = String.Format("Displaying {0}-{1} Of {2}", start, end, total);        
}
  

Комментарии:

1. Джеймс, что dt в первом if из BindDataGrid?

2. Это была DataTable привязка к сетке, но я упростил пример и забыл его удалить. Теперь это исчезло.

Ответ №3:

Итак, один из моих коллег в конечном итоге помог мне с этим. Хорошо! Это конечный результат моей подкачки DataGrid . Весь этот код позволил мне получить количество элементов, извлеченных из базы данных, установить VirtualItemCount (который также задает количество отображаемых страниц) и просматривать данные. Пожалуйста, обратите внимание, что AllDataSources — это отдельный класс, который просто извлекает данные из базы данных способом, который работает с настройкой моей сетки, а CamSizerData — это имя Table файла, который содержит все данные и используется для получения подсчета. Если у вас есть какие-либо другие вопросы, пожалуйста, не стесняйтесь спрашивать. 🙂

DataGrid

 <asp:DataGrid ID="dgArchive" CssClass="data" AutoGenerateColumns="False" runat="server"
    AllowPaging="True" AllowCustomPaging="True" Visible="False" OnPageIndexChanged="dgArchive_PageIndexChanged">
    <Columns>
        <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="line">
            <HeaderTemplate>
                Line</HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="LineNumber" Text='<%# DataBinder.Eval(Container.DataItem, "LineNumber") %>'
                    runat="server" /></ItemTemplate>
            <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle>
            <ItemStyle CssClass="line"></ItemStyle>
        </asp:TemplateColumn>
        <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="date">
            <HeaderTemplate>
                Date</HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="CreateDate" Text='<%# DataBinder.Eval(Container.DataItem, "CreateDate", "{0: MM/dd/yyyy}") %>'
                    runat="server" /></ItemTemplate>
            <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle>
            <ItemStyle CssClass="date"></ItemStyle>
        </asp:TemplateColumn>
        <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="operator">
            <HeaderTemplate>
                Operator</HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="Operator" Text='<%# DataBinder.Eval(Container.DataItem, "Operator") %>'
                    runat="server" /></ItemTemplate>
            <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle>
            <ItemStyle CssClass="operator"></ItemStyle>
        </asp:TemplateColumn>
        <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="product">
            <HeaderTemplate>
                Product</HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="Product" Text='<%# DataBinder.Eval(Container.DataItem, "ProdNumber") %>' runat="server" /></ItemTemplate>
            <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle>
            <ItemStyle CssClass="product"></ItemStyle>
        </asp:TemplateColumn>
    </Columns>
    <PagerStyle Mode="NumericPages" PageButtonCount="5" />
</asp:DataGrid>
  

Код позади

 protected void Page_Load(object sender, EventArgs e)
    {
        Page.MaintainScrollPositionOnPostBack = true;
    }

    protected void GetDateEntries_Click(object sender, EventArgs e)
    {
        dgArchive.Visible = true;
        using (Entities ent = new Entities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString()))
        {
            DateTime start = Convert.ToDateTime(Start.Text);
            DateTime end = Convert.ToDateTime(End.Text).AddDays(1);
            AllDataSources ds = new AllDataSources();
            CamsizerData cd = new CamsizerData();
            IEnumerable<CamsizerData> led = cd.GetBySelectedDates(ent, start, end);
            int counter = led.Count();
            dgArchive.VirtualItemCount = counter;

            dgArchive.DataSource = ds.populateArchive(ent, start, end);
            dgArchive.DataBind();
        }
    }

    protected void dgArchive_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
    {
        if (source != null)
        {                
            dgArchive.CurrentPageIndex = e.NewPageIndex;
            Entities ent = new Entities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString());
            DateTime start = Convert.ToDateTime(Start.Text);
            DateTime end = Convert.ToDateTime(End.Text).AddDays(1);
            AllDataSources ds = new AllDataSources();

            IEnumerable<object> recs = ds.populateArchive(ent, start, end);
            dgArchive.DataSource = recs.Skip(10 * e.NewPageIndex);
            dgArchive.DataBind();
        }
    }