#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"
>
Комментарии:
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();
}
}