Stronicowanie i sortowanie danych raportu (C#)
Autor : Scott Mitchell
Stronicowanie i sortowanie to dwie bardzo typowe funkcje podczas wyświetlania danych w aplikacji online. W tym samouczku najpierw przyjrzymy się dodawaniu sortowania i stronicowania do raportów, które następnie będziemy konstruować w przyszłych samouczkach.
Wprowadzenie
Stronicowanie i sortowanie to dwie bardzo typowe funkcje podczas wyświetlania danych w aplikacji online. Na przykład podczas wyszukiwania ASP.NET książek w księgarni online mogą istnieć setki takich książek, ale raport zawierający listę wyników wyszukiwania zawiera tylko dziesięć dopasowań na stronę. Ponadto wyniki można sortować według tytułu, ceny, liczby stron, nazwy autora itd. W poprzednich 23 samouczkach przeanalizowano sposób tworzenia różnych raportów, w tym interfejsów, które zezwalają na dodawanie, edytowanie i usuwanie danych, nie przyjrzeliśmy się sposobom sortowania danych i jedynymi przykładami stronicowania, które widzieliśmy w kontrolkach DetailsView i FormView.
W tym samouczku zobaczymy, jak dodać sortowanie i stronicowanie do raportów, co można wykonać, po prostu zaznaczając kilka pól wyboru. Niestety, ta uproszczona implementacja ma swoje wady interfejs sortowania pozostawia nieco do życzenia, a procedury stronicowania nie są przeznaczone do wydajnego stronicowania za pośrednictwem dużych zestawów wyników. W przyszłych samouczkach dowiesz się, jak przezwyciężyć ograniczenia gotowego rozwiązania do stronicowania i sortowania.
Krok 1. Dodawanie stron sieci Web samouczka stronicowania i sortowania
Przed rozpoczęciem tego samouczka najpierw poświęćmy chwilę na dodanie stron ASP.NET potrzebnych w tym samouczku i następnych trzech. Rozpocznij od utworzenia nowego folderu w projekcie o nazwie PagingAndSorting
. Następnie dodaj do tego folderu pięć ASP.NET stron, po skonfigurowaniu ich do używania strony Site.master
wzorcowej:
Default.aspx
SimplePagingSorting.aspx
EfficientPaging.aspx
SortParameter.aspx
CustomSortingUI.aspx
Rysunek 1. Tworzenie folderu PagingAndSorting i dodawanie strony ASP.NET samouczka
Następnie otwórz Default.aspx
stronę i przeciągnij kontrolkę SectionLevelTutorialListing.ascx
użytkownika z UserControls
folderu na powierzchnię Projekt. Ta kontrolka użytkownika utworzona w samouczku Dotyczącym stron wzorcowych i nawigacji witryny wylicza mapę witryny i wyświetla te samouczki w bieżącej sekcji na liście punktowanej.
Rysunek 2. Dodawanie kontrolki użytkownika SectionLevelTutorialListing.ascx w celu Default.aspx
Aby lista punktowana wyświetlała samouczki dotyczące stronicowania i sortowania, które utworzymy, musimy dodać je do mapy witryny. Web.sitemap
Otwórz plik i dodaj następujący znacznik po adiustacji w węźle Edytowanie, Wstawianie i Usuwanie mapy witryny:
<siteMapNode title="Paging and Sorting" url="~/PagingAndSorting/Default.aspx"
description="Samples of Reports that Provide Paging and Sorting Capabilities">
<siteMapNode url="~/PagingAndSorting/SimplePagingSorting.aspx"
title="Simple Paging & Sorting Examples"
description="Examines how to add simple paging and sorting support." />
<siteMapNode url="~/PagingAndSorting/EfficientPaging.aspx"
title="Efficiently Paging Through Large Result Sets"
description="Learn how to efficiently page through large result sets." />
<siteMapNode url="~/PagingAndSorting/SortParameter.aspx"
title="Sorting Data at the BLL or DAL"
description="Illustrates how to perform sorting logic in the Business Logic
Layer or Data Access Layer." />
<siteMapNode url="~/PagingAndSorting/CustomSortingUI.aspx"
title="Customizing the Sorting User Interface"
description="Learn how to customize and improve the sorting user interface." />
</siteMapNode>
Rysunek 3. Aktualizowanie mapy witryny w celu uwzględnienia nowych stron ASP.NET
Krok 2. Wyświetlanie informacji o produkcie w siatceView
Zanim faktycznie zaimplementujemy możliwości stronicowania i sortowania, najpierw utwórzmy standardowy, niestronicowy element GridView, który wyświetla informacje o produkcie. Jest to zadanie, które wykonaliśmy wiele razy wcześniej w tej serii samouczków, więc te kroki powinny być znane. Zacznij od otwarcia SimplePagingSorting.aspx
strony i przeciągnięcia kontrolki GridView z przybornika do Projektant, ustawiając jej ID
właściwość na Products
. Następnie utwórz nową klasę ObjectDataSource, która zwraca wszystkie informacje o produkcie przy użyciu metody klasy GetProducts()
ProductsBLL.
Rysunek 4. Pobieranie informacji o wszystkich produktach przy użyciu metody GetProducts()
Ponieważ ten raport jest raportem tylko do odczytu, nie ma potrzeby mapowania metod ObjectDataSource s Insert()
, Update()
lub Delete()
na odpowiednie ProductsBLL
metody. W związku z tym wybierz pozycję (Brak) z listy rozwijanej kart UPDATE, INSERT i DELETE.
Rysunek 5. Wybieranie opcji (Brak) na liście Drop-Down na kartach UPDATE, INSERT i DELETE
Następnie dostosujmy pola kontrolki GridView, aby wyświetlane są tylko nazwy produktów, dostawców, kategorii, cen i stanów zakończonych. Ponadto możesz wprowadzić zmiany formatowania na poziomie pola, takie jak dostosowanie HeaderText
właściwości lub formatowanie ceny jako waluty. Po tych zmianach znaczniki deklaratywne w kodzie GridView powinny wyglądać podobnie do następujących:
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True" SortExpression="SupplierName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:C}"
HtmlEncode="False" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
Rysunek 6 przedstawia postęp do tej pory po wyświetleniu w przeglądarce. Zwróć uwagę, że strona zawiera listę wszystkich produktów na jednym ekranie, pokazując nazwę, kategorię, dostawcę, cenę i stan przerwania.
Rysunek 6. Każdy z produktów jest wyświetlany (kliknij, aby wyświetlić obraz pełnowymiarowy)
Krok 3. Dodawanie obsługi stronicowania
Wyświetlenie listy wszystkich produktów na jednym ekranie może prowadzić do przeciążenia informacji dla użytkownika przeglądającego dane. Aby ułatwić zarządzanie wynikami, możemy podzielić dane na mniejsze strony danych i umożliwić użytkownikowi przechodzenie przez dane po jednej stronie naraz. Aby to zrobić, wystarczy zaznaczyć pole wyboru Włącz stronicowanie z tagu inteligentnego GridView (powoduje to ustawienie właściwości GridView AllowPaging
na true
wartość ).
Rysunek 7. Zaznacz pole wyboru Włącz stronicowanie, aby dodać obsługę stronicowania (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Włączenie stronicowania ogranicza liczbę rekordów wyświetlanych na stronie i dodaje interfejs stronicowania do kontrolki GridView. Domyślny interfejs stronicowania, pokazany na rysunku 7, to seria numerów stron, umożliwiająca użytkownikowi szybkie przechodzenie z jednej strony danych do innej. Ten interfejs stronicowania powinien wyglądać znajomo, jak widzieliśmy podczas dodawania obsługi stronicowania do kontrolek DetailsView i FormView w poprzednich samouczkach.
Kontrolki DetailsView i FormView pokazują tylko jeden rekord na stronę. Obiekt GridView sprawdza jednak jego PageSize
właściwość , aby określić, ile rekordów ma być wyświetlanych na stronie (ta właściwość jest domyślnie ustawiona na wartość 10).
Ten interfejs stronicowania GridView, DetailsView i FormView można dostosować przy użyciu następujących właściwości:
PagerStyle
wskazuje informacje o stylu dla interfejsu stronicowania; Może określać ustawienia, takie jakBackColor
,ForeColor
,CssClass
,HorizontalAlign
i tak dalej.PagerSettings
Zawiera bevy właściwości, które mogą dostosować funkcjonalność interfejsu stronicowania;PageButtonCount
wskazuje maksymalną liczbę liczbowych numerów stron wyświetlanych w interfejsie stronicowania (wartość domyślna to 10);Mode
właściwość wskazuje sposób działania interfejsu stronicowania i można ustawić na:NextPrevious
wyświetla przyciski Dalej i Poprzednie, co umożliwia użytkownikowi przechodzenie do przodu lub do tyłu po jednej stronie narazNextPreviousFirstLast
Oprócz przycisków Dalej i Poprzedni, dostępne są również przyciski Pierwsze i Ostatnie, dzięki czemu użytkownik może szybko przejść do pierwszej lub ostatniej strony danychNumeric
wyświetla serię numerów stron, dzięki czemu użytkownik może natychmiast przejść do dowolnej stronyNumericFirstLast
oprócz numerów stron zawiera przyciski Pierwszy i Ostatni, dzięki czemu użytkownik może szybko przejść do pierwszej lub ostatniej strony danych; Przyciski Pierwsze/Ostatnie są wyświetlane tylko wtedy, gdy nie można dopasować wszystkich liczbowych numerów stron
Ponadto wszystkie kontrolki GridView, DetailsView i FormView oferują PageIndex
właściwości i PageCount
, które wskazują na przeglądaną bieżącą stronę oraz łączną liczbę stron danych. Właściwość PageIndex
jest indeksowana od 0, co oznacza, że podczas wyświetlania pierwszej strony danych PageIndex
będzie równa 0. PageCount
Z drugiej strony rozpoczyna się liczenie od 1, co oznacza, że PageIndex
jest to ograniczone do wartości z zakresu od 0 PageCount - 1
do .
Poświęćmy chwilę, aby poprawić domyślny wygląd interfejsu stronicowania kontrolki GridView. W szczególności przyjrzyjmy się interfejsowi stronicowania wyrównanym do jasnoszaryego tła. Zamiast ustawiać te właściwości bezpośrednio za pośrednictwem właściwości GridView PagerStyle
, utwórzmy klasę CSS o Styles.css
nazwie PagerRowStyle
, a następnie przypiszmy PagerStyle
właściwość s CssClass
za pomocą naszego motywu. Zacznij od otwarcia Styles.css
i dodania następującej definicji klasy CSS:
.PagerRowStyle
{
background-color: #ddd;
text-align: right;
}
Następnie otwórz GridView.skin
plik w folderze DataWebControls
w folderze App_Themes
. Jak omówiono w samouczku Strony wzorcowe i Nawigacja po witrynie , pliki skórek mogą służyć do określania domyślnych wartości właściwości dla kontrolki sieci Web. W związku z tym rozszerz istniejące ustawienia, aby uwzględnić ustawienie PagerStyle
właściwości s CssClass
na PagerRowStyle
. Ponadto skonfigurujmy interfejs stronicowania tak, aby wyświetlał co najwyżej pięć przycisków stron liczbowych przy użyciu interfejsu NumericFirstLast
stronicowania.
<asp:GridView runat="server" CssClass="DataWebControlStyle">
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<RowStyle CssClass="RowStyle" />
<HeaderStyle CssClass="HeaderStyle" />
<FooterStyle CssClass="FooterStyle" />
<SelectedRowStyle CssClass="SelectedRowStyle" />
<PagerStyle CssClass="PagerRowStyle" />
<PagerSettings Mode="NumericFirstLast" PageButtonCount="5" />
</asp:GridView>
Środowisko użytkownika stronicowania
Rysunek 8 przedstawia stronę internetową po odwiedzeniu w przeglądarce po zaznaczeniu pola wyboru Włącz stronicowanie kontrolki GridView, a PagerStyle
konfiguracje i PagerSettings
zostały wykonane za pośrednictwem GridView.skin
pliku. Zwróć uwagę, jak pokazano tylko dziesięć rekordów, a interfejs stronicowania wskazuje, że wyświetlamy pierwszą stronę danych.
Rysunek 8. Po włączeniu stronicowania wyświetlane są tylko podzbiór rekordów (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Gdy użytkownik kliknie jeden z numerów stron w interfejsie stronicowania, zostanie wyświetlony komunikat zwrotny i ponowne załadowanie strony pokazujące, że żądane rekordy stron. Rysunek 9 przedstawia wyniki po wybraniu opcji wyświetlenia ostatniej strony danych. Zwróć uwagę, że ostatnia strona ma tylko jeden rekord; Wynika to z tego, że w sumie istnieje 81 rekordów, co daje osiem stron z 10 rekordami na stronę oraz jedną stronę z rekordem samotnym.
Rysunek 9. Kliknięcie numeru strony powoduje wyświetlenie ogłaszania zwrotnego i wyświetlenie odpowiedniego podzbioru rekordów (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Przepływ pracy Server-Side stronicowania
Gdy użytkownik końcowy kliknie przycisk w interfejsie stronicowania, rozpoczyna się ogłaszanie zwrotne i rozpoczyna się następujący przepływ pracy po stronie serwera:
- Zdarzenie GridView (lub DetailsView lub FormView)
PageIndexChanging
jest uruchamiane - Obiekt ObjectDataSource ponownie żąda wszystkich danych z BLL; Wartości właściwości i
PageSize
sPageIndex
GridView służą do określania, które rekordy zwrócone z BLL muszą być wyświetlane w siatce - Zdarzenie GridView jest
PageIndexChanged
uruchamiane
W kroku 2 obiekt ObjectDataSource ponownie żąda wszystkich danych ze źródła danych. Ten styl stronicowania jest często określany jako domyślne stronicowanie, ponieważ jest to zachowanie stronicowania używane domyślnie podczas ustawiania AllowPaging
właściwości na true
wartość . Przy domyślnym stronicowaniu kontrolka internetowa danych naiwnie pobiera wszystkie rekordy dla każdej strony danych, mimo że tylko podzbiór rekordów jest faktycznie renderowany w kodzie HTML wysyłanym do przeglądarki. Jeśli dane bazy danych nie są buforowane przez usługę BLL lub ObjectDataSource, domyślne stronicowanie nie jest możliwe w przypadku wystarczająco dużych zestawów wyników lub aplikacji internetowych z wieloma równoczesnymi użytkownikami.
W następnym samouczku sprawdzimy, jak zaimplementować niestandardowe stronicowanie. Dzięki niestandardowemu stronicowaniu można konkretnie poinstruować obiekt ObjectDataSource, aby pobierał tylko dokładny zestaw rekordów potrzebnych dla żądanej strony danych. Jak można sobie wyobrazić, stronicowanie niestandardowe znacznie poprawia wydajność stronicowania za pomocą dużych zestawów wyników.
Uwaga
Podczas gdy domyślne stronicowanie nie jest odpowiednie w przypadku stronicowania za pośrednictwem wystarczająco dużych zestawów wyników lub witryn z wieloma równoczesnymi użytkownikami, należy pamiętać, że stronicowanie niestandardowe wymaga większej liczby zmian i wysiłków w celu zaimplementowania i nie jest tak proste, jak zaznaczenie pola wyboru (podobnie jak domyślne stronicowanie). W związku z tym domyślne stronicowanie może być idealnym wyborem dla witryn internetowych o małym ruchu lub w przypadku stronicowania za pomocą stosunkowo małych zestawów wyników, ponieważ znacznie łatwiej i szybciej wdrożyć.
Jeśli na przykład wiemy, że nigdy nie będziemy mieć więcej niż 100 produktów w naszej bazie danych, minimalny zysk wydajności, którego cieszy się niestandardowe stronicowanie, prawdopodobnie zostanie zrównoważony przez nakład pracy wymagany do zaimplementowania. Jeśli jednak możemy pewnego dnia mieć tysiące lub dziesiątki tysięcy produktów, nie implementowanie niestandardowego stronicowania znacznie utrudniłoby skalowalność naszej aplikacji.
Krok 4. Dostosowywanie środowiska stronicowania
Kontrolki sieci Web danych udostępniają wiele właściwości, które mogą służyć do ulepszania środowiska stronicowania użytkownika. Właściwość PageCount
, na przykład, wskazuje liczbę wszystkich stron, podczas gdy PageIndex
właściwość wskazuje bieżącą stronę odwiedzaną i można je ustawić, aby szybko przenieść użytkownika do określonej strony. Aby zilustrować sposób korzystania z tych właściwości w celu ulepszenia środowiska stronicowania użytkownika, dodajmy do naszej strony kontrolkę Etykieta sieci Web, która informuje użytkownika o aktualnie odwiedzanej stronie wraz z kontrolką DropDownList, która pozwala im szybko przejść do dowolnej danej strony.
Najpierw dodaj kontrolkę Etykieta sieci Web do strony, ustaw jej ID
właściwość na PagingInformation
, i wyczyść jej Text
właściwość. Następnie utwórz procedurę obsługi zdarzeń dla zdarzenia GridView i DataBound
dodaj następujący kod:
protected void Products_DataBound(object sender, EventArgs e)
{
PagingInformation.Text = string.Format("You are viewing page {0} of {1}...",
Products.PageIndex + 1, Products.PageCount);
}
Ta procedura obsługi zdarzeń przypisuje PagingInformation
właściwość Etykieta Text
do komunikatu informującego użytkownika o stronie, którą obecnie odwiedza Products.PageIndex + 1
z liczby stron Products.PageCount
całkowitych (dodajemy 1 do Products.PageIndex
właściwości, ponieważ PageIndex
jest indeksowana od 0). Wybrałem właściwość assign this Label s Text
w DataBound
programie obsługi zdarzeń w przeciwieństwie do PageIndexChanged
programu obsługi zdarzeń, ponieważ zdarzenie jest wyzwalane za każdym razem, gdy dane są powiązane z obiektem GridView, podczas DataBound
gdy PageIndexChanged
program obsługi zdarzeń jest uruchamiany tylko po zmianie indeksu strony. Gdy element GridView jest początkowo danymi powiązanymi z pierwszą wizytą strony, PageIndexChanging
zdarzenie nie jest uruchamiane (podczas gdy DataBound
zdarzenie działa).
Po dodaniu użytkownik jest teraz wyświetlany komunikat wskazujący, jaką stronę odwiedza, oraz liczbę wszystkich stron danych.
Rysunek 10. Wyświetlana jest bieżąca liczba stron i całkowita liczba stron (kliknij, aby wyświetlić obraz pełnowymiarowy)
Oprócz kontrolki Etykieta dodajmy również kontrolkę DropDownList, która wyświetla numery stron w kontrolce GridView z wybraną aktualnie wyświetloną stroną. Oto pomysł, że użytkownik może szybko przejść z bieżącej strony do innej, po prostu wybierając nowy indeks strony z listy Rozwijanej. Zacznij od dodania listy rozwijanej do Projektant, ustawienia jej ID
właściwości na PageList
i sprawdzenia opcji Włącz autopostback z tagu inteligentnego.
Następnie wróć do procedury obsługi zdarzeń DataBound
i dodaj następujący kod:
// Clear out all of the items in the DropDownList
PageList.Items.Clear();
// Add a ListItem for each page
for (int i = 0; i < Products.PageCount; i++)
{
// Add the new ListItem
ListItem pageListItem = new ListItem(string.Concat("Page ", i + 1), i.ToString());
PageList.Items.Add(pageListItem);
// select the current item, if needed
if (i == Products.PageIndex)
pageListItem.Selected = true;
}
Ten kod rozpoczyna się od wyczyszczenia elementów na liście rozwijanej PageList
. Może to wydawać się zbędne, ponieważ nie spodziewa się zmiany liczby stron, ale inni użytkownicy mogą używać systemu jednocześnie, dodając lub usuwając rekordy z Products
tabeli. Takie wstawiania lub usuwania mogą zmienić liczbę stron danych.
Następnie należy ponownie utworzyć numery stron i mieć te, które są domyślnie mapowane na bieżący element GridView PageIndex
. Osiągamy to za pomocą pętli od 0 do PageCount - 1
, dodając nową ListItem
w każdej iteracji i ustawiając jej Selected
właściwość na wartość true, jeśli bieżący indeks iteracji jest równy właściwości GridView s PageIndex
.
Na koniec musimy utworzyć procedurę obsługi zdarzeń dla zdarzenia DropDownList SelectedIndexChanged
, które jest uruchamiane za każdym razem, gdy użytkownik wybierze inny element z listy. Aby utworzyć tę procedurę obsługi zdarzeń, po prostu kliknij dwukrotnie Listę rozwijaną w Projektant, a następnie dodaj następujący kod:
protected void PageList_SelectedIndexChanged(object sender, EventArgs e)
{
// Jump to the specified page
Products.PageIndex = Convert.ToInt32(PageList.SelectedValue);
}
Jak pokazano na rysunku 11, zmiana właściwości GridView powoduje, że dane zostaną odbicia do kontrolki GridView PageIndex
. W procedurze obsługi zdarzeń GridView DataBound
wybrano odpowiednią listę Rozwijaną.ListItem
Rysunek 11. Użytkownik jest automatycznie pobierany do szóstej strony po wybraniu elementu listy Drop-Down strony 6 (kliknij, aby wyświetlić obraz pełnowymiarowy)
Krok 5. Dodawanie obsługi sortowania Bi-Directional
Dodanie obsługi sortowania dwukierunkowego jest tak proste, jak dodawanie obsługi stronicowania po prostu sprawdź opcję Włącz sortowanie z tagu inteligentnego GridView (który ustawia właściwość GridView na AllowSorting
true
). Spowoduje to renderowanie każdego nagłówka pól GridView jako kolumny LinkButtons, które po kliknięciu powodują powrót i zwracają dane posortowane według klikniętej kolumny w kolejności rosnącej. Kliknięcie tego samego nagłówka LinkButton ponownie posortuje dane w kolejności malejącej.
Uwaga
Jeśli używasz niestandardowej warstwy dostępu do danych, a nie typu zestawu danych, być może nie masz opcji Włącz sortowanie w tagu inteligentnym GridView. Dostępne jest tylko pole wyboru GridViews powiązane ze źródłami danych, które natywnie obsługują sortowanie. Zestaw Danych Typed zapewnia obsługę sortowania gotowego do użycia, ponieważ ADO.NET DataTable udostępnia metodęSort
, która po wywołaniu sortuje wartości DataTable dataRows przy użyciu określonych kryteriów.
Jeśli nazwa DAL nie zwraca obiektów, które natywnie obsługują sortowanie, należy skonfigurować obiekt ObjectDataSource w celu przekazania informacji sortowania do warstwy logiki biznesowej, które mogą sortować dane lub sortować dane według dal. W przyszłym samouczku dowiesz się, jak sortować dane w warstwach logiki biznesowej i dostępu do danych.
Sortowanie LinkButtons są renderowane jako hiperlinki HTML, których bieżące kolory (niebieski dla nieodwiedzonego łącza i ciemnoczerwony dla odwiedzonego linku) starcia z kolorem tła wiersza nagłówka. Zamiast tego mamy wszystkie linki wiersza nagłówka wyświetlane w kolorze białym, niezależnie od tego, czy zostały one odwiedzone, czy nie. Można to zrobić, dodając następujące elementy do Styles.css
klasy:
.HeaderStyle a, .HeaderStyle a:visited
{
color: White;
}
Ta składnia wskazuje na użycie białego tekstu podczas wyświetlania tych hiperlinków w elemecie używającym klasy HeaderStyle.
Po dodaniu tego arkusza CSS podczas odwiedzania strony za pośrednictwem przeglądarki ekran powinien wyglądać podobnie do rysunku 12. W szczególności rysunek 12 przedstawia wyniki po kliknięciu linku nagłówka pola Cena.
Rysunek 12. Wyniki zostały posortowane według wartości UnitPrice w kolejności rosnącej (kliknij, aby wyświetlić obraz pełnowymiarowy)
Badanie przepływu pracy sortowania
Wszystkie pola GridView pola BoundField, CheckBoxField, TemplateField itd. mają właściwość wskazującą SortExpression
wyrażenie, które powinno służyć do sortowania danych po kliknięciu linku nagłówka sortowania tego pola. Obiekt GridView ma SortExpression
również właściwość . Po kliknięciu przycisku LinkButton nagłówka sortowania element GridView przypisuje wartość tego pola SortExpression
do jego SortExpression
właściwości. Następnie dane są ponownie pobierane z obiektu ObjectDataSource i posortowane zgodnie z właściwością GridView.SortExpression
Poniższa lista zawiera szczegółowe informacje o sekwencji kroków, które są wykonywane, gdy użytkownik końcowy sortuje dane w elemecie GridView:
- Zdarzenie sortowania usługi GridView jest uruchamiane
- Właściwość GridView
SortExpression
jest ustawiona naSortExpression
pole, którego nagłówek sortowania LinkButton został kliknięty - Obiekt ObjectDataSource ponownie pobiera wszystkie dane z biblioteki BLL, a następnie sortuje dane przy użyciu kontrolki GridView s
SortExpression
- Właściwość GridView
PageIndex
jest resetowana do wartości 0, co oznacza, że podczas sortowania użytkownik jest zwracany do pierwszej strony danych (przy założeniu, że zaimplementowano obsługę stronicowania) - Zdarzenie GridView jest
Sorted
wyzwalane
Podobnie jak w przypadku domyślnego stronicowania, domyślna opcja sortowania ponownie pobiera wszystkie rekordy z usługi BLL. W przypadku korzystania z sortowania bez stronicowania lub sortowania z domyślnym stronicowaniem nie ma możliwości obejścia tego trafienia wydajności (brak buforowania danych bazy danych). Jednak jak zobaczymy w przyszłym samouczku, można efektywnie sortować dane podczas korzystania z niestandardowego stronicowania.
Po powiązaniu obiektu ObjectDataSource z kontrolką GridView za pośrednictwem listy rozwijanej w tagu inteligentnym GridView każde pole GridView automatycznie ma przypisaną właściwość SortExpression
do nazwy pola danych w ProductsRow
klasie. Na przykład parametr ProductName
BoundField s SortExpression
jest ustawiony na ProductName
wartość , jak pokazano w następującym deklaratywnej adiustacji:
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
Pole można skonfigurować tak, aby nie można było sortować, usuwając jego SortExpression
właściwość (przypisując je do pustego ciągu). Aby to zilustrować, wyobraź sobie, że nie chcemy, aby nasi klienci sortować nasze produkty według ceny. Właściwość UnitPrice
BoundField SortExpression
można usunąć z deklaratywnego znaczników lub za pośrednictwem okna dialogowego Pola (dostępnego przez kliknięcie linku Edytuj kolumny w tagu inteligentnym GridView).
Rysunek 13. Wyniki zostały posortowane według wartości UnitPrice w kolejności rosnącej
Po usunięciu SortExpression
UnitPrice
właściwości dla pola BoundField nagłówek jest renderowany jako tekst, a nie jako link, co uniemożliwia użytkownikom sortowanie danych według ceny.
Rysunek 14. Usunięcie właściwości SortExpression powoduje, że użytkownicy nie mogą już sortować produktów według ceny (kliknij, aby wyświetlić obraz pełnowymiarowy)
Programowe sortowanie kontrolki GridView
Zawartość elementu GridView można również sortować programowo przy użyciu metody GridView.Sort
Wystarczy przekazać SortExpression
wartość do sortowania według wartości ( SortDirection
Ascending
lub Descending
), a dane gridView zostaną ponownie posortowane.
Wyobraź sobie, że powodem, dla którego wyłączyliśmy sortowanie, UnitPrice
było to, że martwiliśmy się, że nasi klienci po prostu kupią tylko najniższe produkty. Chcemy jednak zachęcić ich do zakupu najdroższych produktów, więc chcielibyśmy, aby mogli sortować produkty według ceny, ale tylko od najdroższej ceny do najmniejszych.
Aby to zrobić, dodaj kontrolkę Sieć Web przycisku do strony, ustaw jej ID
właściwość na SortPriceDescending
, a jej Text
właściwość na Sortuj według ceny. Następnie utwórz procedurę obsługi zdarzeń dla zdarzenia PrzyciskClick
, klikając dwukrotnie kontrolkę Przycisk w Projektant. Dodaj następujący kod do tej procedury obsługi zdarzeń:
protected void SortPriceDescending_Click(object sender, EventArgs e)
{
// Sort by UnitPrice in descending order
Products.Sort("UnitPrice", SortDirection.Descending);
}
Kliknięcie tego przycisku zwraca użytkownika do pierwszej strony z produktami posortowanych według ceny, od najdroższych do najtańszych (zobacz Rysunek 15).
Rysunek 15. Kliknięcie przycisku Orders the Products From the Most Expensive to the Least (Kliknij, aby wyświetlić obraz pełnowymiarowy)
Podsumowanie
W tym samouczku pokazano, jak zaimplementować domyślne możliwości stronicowania i sortowania, które były tak proste jak zaznaczenie pola wyboru. Gdy użytkownik sortuje dane lub strony, podobny przepływ pracy rozwija się:
- Po powrocie po awarii
- Zdarzenia wstępnego poziomu kontroli danych w sieci Web są wyzwalane (
PageIndexChanging
lubSorting
) - Wszystkie dane są pobierane ponownie przez obiekt ObjectDataSource
- Zdarzenia po poziomie kontroli danych sieci Web są wyzwalane (
PageIndexChanged
lubSorted
)
Podczas implementowania podstawowych stronicowania i sortowania jest bryza, należy zwiększyć nakład pracy, aby korzystać z bardziej wydajnego niestandardowego stronicowania lub dalszego ulepszania interfejsu stronicowania lub sortowania. Przyszłe samouczki omówią te tematy.
Szczęśliwe programowanie!
Informacje o autorze
Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.