Как заставить список просмотров, чтобы показать первую страницу программно
Вопрос
У меня есть Paged ASP.NET ListView. Показанные данные отфильтрованы, которые можно управлять формой. Когда фильтр изменяется изменяется, я создаю новый запрос и выполните databind.
Проблема, однако, когда я перехожу на следующую страницу, и установила фильтр, отображает список «Нет возврата данных». Это не странно, потому что после того, как фильтр применяется, существует только одна страница данных.
Так что я хочу сделать, это сбросить пейджер. Это правильное решение проблемы? И как мне это сделать?
Решение
Я использую этот хак в моем обработчике нагрузки. Это не будет сбросить пейджер, если количество элементов результатов одинаково, но индекс страницы все равно будет действительным, поэтому я могу жить с этим.
if (IsPostBack)
{
DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
{
pgr.SetPageProperties(0, pgr.MaximumRows, false);
}
}
Другие советы
Если вы знаете, как это сделать, это просто. Я добавил код ниже моему onchange
-Вцены моего фильтра:
DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager;
if (pager != null)
{
pager.SetPageProperties(0, pager.PageSize, true);
}
Любое из приведенных выше решений правильно, поскольку они оба называют тот же метод. Я просто думаю, что следует отметить, что вы должны позвонить yourPagerElement.SetPageProperties(...)
Везде, где вы хотите, чтобы ваш источник данных (то есть список или массив и т. Д.) Быть обновленным. Например, после нанесения некоторой фильтрации или что-то, что значительно изменяет размер списка.
У вас могут быть проблемы, если ваш список просмотров автоматически ограничен (то есть ObjectDataSource)
Обработчик событий Load не работает, потому что у вас еще нет нового значения dataPager.totalrowpage, но вы можете обрабатывать страницу_пререндераComplete, как это:
protected void Page_PreRenderComplete(object sender, EventArgs e)
{
// PreRenderComplete occurs just after databindings page events
// And saves to viewstate
// Trick on search to avoid "No data" on results when old page is greater than actual row count
if (DataPager1.StartRowIndex > DataPager1.TotalRowCount )
DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true);
}
Это всегда оставляет ListView на странице с данными. Если страница больше, чем Toverrow, переключитесь на первую страницу.
Примечания: Я использую эфикантивную пейджинг, и возвращая только данные, которые будут отображаться, поэтому мне нужно решить de datasource (последний параметр (true))
Минусы: двойное databind, если StartroWindex больше, чем TotalRowcount.