2010-05-17 9 views
5

Mam listę stron ASP.NET ListView. Przedstawione dane są filtrowane, co można kontrolować za pomocą formularza. Po zmianie formy filtra tworzę nowe zapytanie i wykonuję DataBind.Jak zmusić ListView do wyświetlania programowo pierwszej strony

Problem jednak, kiedy przechodzę do następnej strony i ustawiam filtr, ListView pokazuje "Żadne dane nie zostały zwrócone". To nie jest dziwne, ponieważ po zastosowaniu filtru istnieje tylko jedna strona danych.

To, co chcę zrobić, to zresetować pager. Czy to właściwe rozwiązanie problemu? I jak to zrobić?

+0

Czy używasz QueryStringFields w Pager lub z ViewState? – eugeneK

+0

Nie. Jedyną niestandardową rzeczą, którą robię, jest zrekonstruowanie zapytania Linq z każdym odesłaniem ... – doekman

Odpowiedz

9

Używam tego siekać w moim obsługi obciążenia. Nie spowoduje to zresetowania pagera, jeśli liczba pozycji wynikowych jest taka sama, ale indeks strony będzie nadal ważny, więc na razie mogę z tym żyć.

+0

Działa dla mnie. Pamiętaj, aby ustawić tę opcję, zanim widok listy zostanie powiązany z danymi. – rdans

4

Jeśli wiesz, jak to zrobić, jest to proste. Dodałem poniższy kod do moich onchange -WYDARZENIA mojego filtra:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager; 
if (pager != null) 
{ 
    pager.SetPageProperties(0, pager.PageSize, true); 
} 
1

Każde z powyższych rozwiązań jest poprawne, ponieważ oba wywołują tę samą metodę. Po prostu myślę, że należy zwrócić uwagę, że powinieneś zadzwonić pod numer yourPagerElement.SetPageProperties(...), gdzie chcesz, aby twoje źródło danych (np. Lista lub tablica itp.) Zostało zaktualizowane. Na przykład po zastosowaniu jakiejś filtracji lub czegoś, co znacznie zmienia rozmiar listy.

0

Możesz mieć problemy, jeśli ListView jest automatycznie ograniczona (tzn ObjectDataSource) obsługi zdarzeń

obciążenia nie działa, ponieważ nie masz jeszcze nowej wartości DataPager.TotalRowPage, ale można obsługiwać Page_PreRenderComplete, jak to:

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

To zawsze pozostawia ListView na stronie z danymi. Jeśli strona jest większa niż TotalRow, przejdź na pierwszą stronę.

Uwagi: Używam efective stronicowania, a wracając tylko dane mają być wyświetlane, więc muszę ponownie powiązać de źródła danych (ostatni parametr (true))

Wady: Double DataBind jeśli StartRowIndex jest większa niż TotalRowCount .

Powiązane problemy