Udostępnij za pośrednictwem


Tworzenie interfejsu służącego do wybierania jednego konta użytkownika spośród wielu (C#)

Autor: Scott Mitchell

W tym samouczku utworzymy interfejs użytkownika ze stronicowanym, filtrowalnym siatką. W szczególności nasz interfejs użytkownika będzie składać się z serii LinkButtons do filtrowania wyników na podstawie litery początkowej nazwy użytkownika i kontrolki GridView w celu wyświetlenia pasujących użytkowników. Zaczniemy od wyświetlania listy wszystkich kont użytkowników w elemecie GridView. Następnie w kroku 3 dodamy filtr LinkButtons. Krok 4 analizuje stronicowanie filtrowanych wyników. Interfejs utworzony w krokach od 2 do 4 będzie używany w kolejnych samouczkach do wykonywania zadań administracyjnych dla określonego konta użytkownika.

Wprowadzenie

W samouczku Przypisywanie ról do użytkowników utworzyliśmy interfejs rudimentary dla administratora, aby wybrać użytkownika i zarządzać jej rolami. W szczególności interfejs przedstawia administratorowi listę rozwijaną wszystkich użytkowników. Taki interfejs jest odpowiedni, gdy istnieje kilkadziesiąt kont użytkowników, ale nie jest niesprawdzone dla witryn z setkami lub tysiącami kont. Stronicowana siatka z możliwością filtrowania jest bardziej odpowiednia dla witryn internetowych z dużymi bazami użytkowników.

W tym samouczku utworzymy taki interfejs użytkownika. W szczególności nasz interfejs użytkownika będzie składać się z serii LinkButtons do filtrowania wyników na podstawie litery początkowej nazwy użytkownika i kontrolki GridView w celu wyświetlenia pasujących użytkowników. Zaczniemy od wyświetlania listy wszystkich kont użytkowników w elemecie GridView. Następnie w kroku 3 dodamy filtr LinkButtons. Krok 4 analizuje stronicowanie filtrowanych wyników. Interfejs utworzony w krokach od 2 do 4 będzie używany w kolejnych samouczkach do wykonywania zadań administracyjnych dla określonego konta użytkownika.

Zaczynamy!

Krok 1. Dodawanie nowych stron ASP.NET

W tym samouczku i w następnych dwóch będziemy badać różne funkcje i możliwości związane z administracją. Będziemy potrzebować serii stron ASP.NET, aby zaimplementować tematy omówione w tych samouczkach. Utwórzmy te strony i zaktualizujmy mapę witryny.

Rozpocznij od utworzenia nowego folderu w projekcie o nazwie Administration. Następnie dodaj dwie nowe strony ASP.NET do folderu, łącząc każdą stronę ze stroną wzorcową Site.master . Nazwij strony:

  • ManageUsers.aspx
  • UserInformation.aspx

Dodaj również dwie strony do katalogu głównego witryny internetowej: ChangePassword.aspx i RecoverPassword.aspx.

Te cztery strony powinny mieć w tym momencie dwie kontrolki Zawartość, jedną dla każdej z symboli ContentPlaceHolders strony wzorcowej: MainContent i LoginContent.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent" Runat="Server">
</asp:Content>

Chcemy wyświetlić domyślny znacznik strony wzorcowej dla symbolu LoginContent ContentPlaceHolder dla tych stron. W związku z tym usuń deklaratywne znaczniki dla kontrolki Content2 Zawartość. Po wykonaniu tej czynności znaczniki stron powinny zawierać tylko jedną kontrolkę Zawartość.

Strony ASP.NET w folderze Administration są przeznaczone wyłącznie dla użytkowników administracyjnych. Dodaliśmy rolę Administratorzy do systemu w samouczku Tworzenie ról i zarządzanie nimi . Ogranicz dostęp do tych dwóch stron do tej roli. Aby to osiągnąć, dodaj Web.config plik do Administration folderu i skonfiguruj jego <authorization> element, aby przyznać użytkowników w roli Administratorzy i odmówić wszystkim innym osobom.

<?xml version="1.0"?>
<configuration>
 <system.web>
 <authorization>
 <allow roles="Administrators" />
 <deny users="*"/>
 </authorization>
 </system.web>
</configuration>

W tym momencie Eksplorator rozwiązań projektu powinny wyglądać podobnie do zrzutu ekranu pokazanego na rysunku 1.

Do witryny internetowej dodano cztery nowe strony i plik Web.config

Rysunek 1. Cztery nowe strony i Web.config plik zostały dodane do witryny internetowej (kliknij, aby wyświetlić obraz pełnowymiarowy)

Na koniec zaktualizuj mapę witryny (Web.sitemap), aby dołączyć wpis do ManageUsers.aspx strony. Dodaj następujący kod XML po <siteMapNode> dodaniu do samouczków ról.

<siteMapNode title="User Administration" url="~/Administration/ManageUsers.aspx"/>

Po zaktualizowaniu mapy witryny odwiedź witrynę za pośrednictwem przeglądarki. Jak pokazano na rysunku 2, nawigacja po lewej stronie zawiera teraz elementy samouczków administracyjnych.

Mapa witryny zawiera węzeł zatytułowany Administracja użytkownikami

Rysunek 2. Mapa witryny zawiera węzeł Zatytułowany Administracja użytkownikami (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 2. Wyświetlanie listy wszystkich kont użytkowników w siatceView

Naszym celem końcowym dla tego samouczka jest utworzenie stronicowanej siatki, za pomocą której administrator może wybrać konto użytkownika do zarządzania. Zacznijmy od wyświetlania listy wszystkich użytkowników w elemecie GridView. Po zakończeniu tej operacji dodamy interfejsy i funkcje filtrowania i stronicowania.

ManageUsers.aspx Otwórz stronę w folderze Administration i dodaj kontrolkę GridView, ustawiając jej ID wartość na UserAccounts. Za chwilę napiszemy kod, aby powiązać zestaw kont użytkowników z obiektem GridView przy użyciu Membership metody klasy GetAllUsers . Jak wspomniano we wcześniejszych samouczkach, metoda GetAllUsers zwraca MembershipUserCollection obiekt, który jest kolekcją MembershipUser obiektów. Każda MembershipUser w kolekcji zawiera właściwości, takie jak UserName, Email, IsApprovedi tak dalej.

Aby wyświetlić żądane informacje o koncie użytkownika w elemecie GridView, ustaw właściwość GridView AutoGenerateColumns na wartość False i dodaj wartości BoundFields dla właściwości , Comment i i CheckBoxFields dla UserNameIsApprovedIsLockedOutwłaściwości , Emaili .IsOnline Tę konfigurację można zastosować za pomocą deklaratywnego znaczników kontrolki lub za pośrednictwem okna dialogowego Pola. Rysunek 3 przedstawia zrzut ekranu okna dialogowego Pola po tym, jak pole wyboru Pola automatycznego generowania zostało niezaznaczone, a pola BoundFields i CheckBoxFields zostały dodane i skonfigurowane.

Dodawanie trzech pól granic i trzech pól CheckBoxFields do elementu GridView

Rysunek 3. Dodawanie trzech pól granic i trzech pól CheckBoxFields do widoku GridView (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po skonfigurowaniu elementu GridView upewnij się, że jego deklaratywny znacznik przypomina następujące elementy:

<asp:GridView ID="UserAccounts" runat="server" AutoGenerateColumns="False">
 <Columns>
 <asp:BoundField DataField="UserName" HeaderText="UserName"/>
 <asp:BoundField DataField="Email" HeaderText="Email" />
 <asp:CheckBoxField DataField="IsApproved" HeaderText="Approved?"/>
 <asp:CheckBoxField DataField="IsLockedOut" HeaderText="Locked Out?" />
 <asp:CheckBoxField DataField="IsOnline" HeaderText="Online?"/>
 <asp:BoundField DataField="Comment" HeaderText="Comment"/>
 </Columns>
</asp:GridView>

Następnie musimy napisać kod, który wiąże konta użytkowników z elementem GridView. Utwórz metodę o nazwie BindUserAccounts , aby wykonać to zadanie, a następnie wywołaj ją z Page_Load procedury obsługi zdarzeń na pierwszej stronie.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    BindUserAccounts();
}

private void BindUserAccounts()
{
    UserAccounts.DataSource = Membership.GetAllUsers();
    UserAccounts.DataBind();
}

Poświęć chwilę na przetestowanie strony za pośrednictwem przeglądarki. Jak pokazano na rysunku 4, funkcja UserAccounts GridView wyświetla listę nazwy użytkownika, adresu e-mail i innych odpowiednich informacji o koncie dla wszystkich użytkowników w systemie.

Konta użytkowników są wyświetlane w elemecie GridView

Rysunek 4. Konta użytkowników są wyświetlane w elemecie GridView (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 3. Filtrowanie wyników według pierwszej litery nazwy użytkownika

Obecnie kontrolka UserAccounts GridView wyświetla wszystkie konta użytkowników. W przypadku witryn internetowych z setkami lub tysiącami kont użytkowników konieczne jest szybkie analizowanie wyświetlanych kont przez użytkownika. Można to osiągnąć, dodając filtrowanie LinkButtons do strony. Dodajmy 27 LinkButtons do strony: jeden zatytułowany Wszystko wraz z jednym Elementem LinkButton dla każdej litery alfabetu. Jeśli gość kliknie pozycję Wszystkie elementy LinkButton, widok GridView wyświetli wszystkich użytkowników. Jeśli klikną konkretną literę, zostaną wyświetlone tylko ci użytkownicy, których nazwa użytkownika zaczyna się od wybranej litery.

Naszym pierwszym zadaniem jest dodanie kontrolek LinkButton 27. Jedną z opcji byłoby utworzenie deklaratywnego elementu LinkButtons 27, jeden naraz. Bardziej elastyczne podejście polega na użyciu kontrolki Repeater z elementem ItemTemplate renderujący element LinkButton, a następnie wiąże opcje filtrowania z repeater jako tablicą string .

Zacznij od dodania kontrolki Repeater do strony powyżej kontrolki UserAccounts GridView. Ustaw właściwość Repeatera ID na FilteringUI. Skonfiguruj szablony repeatera, aby renderować ItemTemplate element LinkButton, którego Text właściwości i CommandName są powiązane z bieżącym elementem tablicy. Jak pokazano w samouczku Przypisywanie ról do użytkowników , można to zrobić przy użyciu Container.DataItem składni powiązania danych. Użyj elementu Repeater, SeparatorTemplate aby wyświetlić pionową linię między poszczególnymi linkami.

<asp:Repeater ID="FilteringUI" runat="server">
 <ItemTemplate>
 <asp:LinkButton runat="server" ID="lnkFilter"
 Text='<%# Container.DataItem %>'
 CommandName='<%# Container.DataItem %>'></asp:LinkButton>
 </ItemTemplate>
 <SeparatorTemplate>|</SeparatorTemplate>
</asp:Repeater>

Aby wypełnić ten repeater żądanymi opcjami filtrowania, utwórz metodę o nazwie BindFilteringUI. Pamiętaj, aby wywołać tę metodę z Page_Load procedury obsługi zdarzeń podczas ładowania pierwszej strony.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindUserAccounts();
        BindFilteringUI();
    }
}

private void BindFilteringUI()
{
    string[] filterOptions = { "All", "A", "B", "C","D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O","P", "Q", "R", "S", "T", "U","V", "W", "X", "Y", "Z" };
    FilteringUI.DataSource = filterOptions;
    FilteringUI.DataBind();
}

Ta metoda określa opcje filtrowania jako elementy w tablicy stringfilterOptions. Dla każdego elementu w tablicy repeater renderuje element LinkButton z jego Text właściwościami przypisanymi CommandName do wartości elementu tablicy.

Rysunek 5 przedstawia ManageUsers.aspx stronę po wyświetleniu za pośrednictwem przeglądarki.

Element powtarzający Listy 27 linków filtrowania

Rysunek 5. Repeater Listy 27 LinkButtons (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga

Nazwy użytkowników mogą zaczynać się od dowolnego znaku, w tym cyfr i interpunkcji. Aby wyświetlić te konta, administrator będzie musiał użyć opcji All LinkButton. Alternatywnie można dodać linkButton, aby zwrócić wszystkie konta użytkowników, które zaczynają się od liczby. Zostawię to jako ćwiczenie dla czytelnika.

Kliknięcie dowolnego z filtrów LinkButtons powoduje powrót i zgłasza zdarzenie repeatera ItemCommand , ale nie ma żadnych zmian w siatce, ponieważ nie napisaliśmy jeszcze kodu w celu filtrowania wyników. Klasa Membership zawiera metodę zwracającą FindUsersByName te konta użytkowników, których nazwa użytkownika jest zgodna z określonym wzorcem wyszukiwania. Możemy użyć tej metody, aby pobrać tylko te konta użytkowników, których nazwy użytkownika zaczynają się od litery określonej przez CommandName filtrowany LinkButton, który został kliknięty.

Zacznij od zaktualizowania ManageUser.aspx klasy za pomocą kodu strony, aby zawierała właściwość o nazwie UsernameToMatch. Ta właściwość utrwała ciąg filtru nazwy użytkownika w przypadku poświadczeń zwrotnych:

private string UsernameToMatch
{
 get
 {
 object o = ViewState["UsernameToMatch"];
 if (o == null)
 return string.Empty;
 else
 return (string)o;
 }
 set
 {
 ViewState["UsernameToMatch"] = value;
 }
}

Właściwość UsernameToMatch przechowuje jej wartość przypisaną ViewState do kolekcji przy użyciu klucza UsernameToMatch. Gdy wartość tej właściwości jest odczytywana, sprawdza, czy wartość istnieje w ViewState kolekcji. Jeśli nie, zwraca wartość domyślną, pusty ciąg. Właściwość UsernameToMatch wykazuje wspólny wzorzec, a mianowicie utrwalanie wartości w celu wyświetlenia stanu, tak aby wszelkie zmiany właściwości zostały utrwalone w ramach ogłaszania zwrotnego. Aby uzyskać więcej informacji na temat tego wzorca, przeczytaj Understanding ASP.NET View State (Informacje o stanie widoku ASP.NET).

Następnie zaktualizuj metodę BindUserAccounts , aby zamiast wywoływać metodę , wywołuje Membership.GetAllUsersMembership.FindUsersByNamemetodę , przekazując wartość UsernameToMatch właściwości dołączonej za pomocą symbolu wieloznakowego SQL, %.

private void BindUserAccounts()
{
    UserAccounts.DataSource = Membership.FindUsersByName(this.UsernameToMatch + "%");
    UserAccounts.DataBind();
}

Aby wyświetlić tylko tych użytkowników, których nazwa użytkownika zaczyna się literą A, ustaw UsernameToMatch właściwość na A, a następnie wywołaj metodę BindUserAccounts. Spowoduje to wywołanie Membership.FindUsersByName("A%")metody , która zwróci wszystkich użytkowników, których nazwa użytkownika rozpoczyna się od A. Podobnie, aby zwrócić wszystkich użytkowników, przypisz pusty ciąg do UsernameToMatch właściwości , aby BindUserAccounts metoda wywołała Membership.FindUsersByName("%")metodę , zwracając w ten sposób wszystkie konta użytkowników.

Utwórz procedurę obsługi zdarzeń dla zdarzenia repeatera ItemCommand . To zdarzenie jest zgłaszane za każdym razem, gdy zostanie kliknięto jeden z filtrów LinkButtons; Jest on przekazywany przez klikniętą wartość LinkButton CommandName za pośrednictwem RepeaterCommandEventArgs obiektu . Musimy przypisać odpowiednią wartość do UsernameToMatch właściwości, a następnie wywołać metodę BindUserAccounts . Jeśli parametr CommandName ma wartość Wszystko, przypisz pusty ciąg, aby UsernameToMatch wyświetlić wszystkie konta użytkowników. W przeciwnym razie przypisz CommandName wartość do UsernameToMatch.

protected void FilteringUI_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "All")
        this.UsernameToMatch = string.Empty;
    else
        this.UsernameToMatch e.CommandName;
    BindUserAccounts();
}

Przy użyciu tego kodu przetestuj funkcjonalność filtrowania. Po pierwszym odwiedzeniu strony zostaną wyświetlone wszystkie konta użytkowników (wróć do rysunku 5). Kliknięcie przycisku A LinkButton powoduje ogłaszanie zwrotne i filtruje wyniki, wyświetlając tylko te konta użytkowników rozpoczynające się od A .

Użyj linków filtrowania, aby wyświetlić tych użytkowników, których nazwa użytkownika zaczyna się od określonej litery

Rysunek 6. Wyświetlanie tych użytkowników, których nazwa użytkownika zaczyna się od określonej litery (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Krok 4. Aktualizowanie kontrolki GridView do korzystania z stronicowania

Element GridView pokazany na rysunkach 5 i 6 zawiera listę wszystkich rekordów zwróconych z FindUsersByName metody . Jeśli istnieją setki lub tysiące kont użytkowników, może to prowadzić do przeciążenia informacji podczas wyświetlania wszystkich kont (tak jak w przypadku kliknięcia przycisku Wszystkie łączeButton lub podczas początkowej wizyty na stronie). Aby ułatwić prezentowanie kont użytkowników w bardziej zarządzanych fragmentach, skonfigurujmy obiekt GridView do wyświetlania 10 kont użytkowników naraz.

Kontrolka GridView oferuje dwa typy stronicowania:

  • Domyślne stronicowanie — łatwe do zaimplementowania, ale niewydajne. W skrócie z domyślnym stronicowaniem kontrolka GridView oczekuje wszystkich rekordów ze źródła danych. Następnie wyświetla tylko odpowiednią stronę rekordów.
  • Stronicowanie niestandardowe — wymaga więcej pracy do zaimplementowania, ale jest bardziej wydajne niż domyślne stronicowanie, ponieważ w przypadku niestandardowego stronicowania źródło danych zwraca tylko dokładny zestaw rekordów do wyświetlenia.

Różnica w wydajności między domyślnym i niestandardowym stronicowaniem może być dość znacząca podczas stronicowania tysięcy rekordów. Ponieważ tworzymy ten interfejs przy założeniu, że mogą istnieć setki lub tysiące kont użytkowników, użyjemy niestandardowego stronicowania.

Uwaga

Bardziej szczegółowe omówienie różnic między domyślnym i niestandardowym stronicowaniem, a także wyzwaniami związanymi z implementacją niestandardowego stronicowania, zapoznaj się z tematem Efficiently Paging Through Large Amounts of Data (Efektywne stronicowanie za pośrednictwem dużych ilości danych).

Aby zaimplementować niestandardowe stronicowanie, najpierw potrzebujemy mechanizmu, za pomocą którego można pobrać dokładny podzbiór rekordów wyświetlanych przez obiekt GridView. Dobrą wiadomością jest to, że Membership metoda klasy FindUsersByName ma przeciążenie, które pozwala nam określić indeks strony i rozmiar strony, i zwraca tylko te konta użytkowników, które należą do tego zakresu rekordów.

W szczególności to przeciążenie ma następujący podpis: FindUsersByName(usernameToMatch, pageIndex, pageSize, totalRecords).

Parametr pageIndex określa stronę kont użytkowników do zwrócenia; pageSize wskazuje liczbę rekordów do wyświetlenia na stronę. TotalRecords parametr jest parametremout, który zwraca liczbę łącznych kont użytkowników w magazynie użytkowników.

Uwaga

Dane zwracane według FindUsersByName są sortowane według nazwy użytkownika. Nie można dostosować kryteriów sortowania.

Obiekt GridView można skonfigurować do korzystania z niestandardowego stronicowania, ale tylko wtedy, gdy jest powiązany z kontrolką ObjectDataSource. Aby kontrolka ObjectDataSource implementowała niestandardowe stronicowanie, wymaga dwóch metod: jednej, która została przekazana indeksowi wiersza początkowego i maksymalnej liczbie rekordów do wyświetlenia, i zwraca dokładny podzbiór rekordów należących do tego zakresu; i metoda zwracająca łączną liczbę rekordów stronicowanych. Przeciążenie FindUsersByName akceptuje indeks strony i rozmiar strony i zwraca łączną liczbę rekordów za pomocą parametru out . W związku z tym występuje niezgodność interfejsu.

Jedną z opcji jest utworzenie klasy serwera proxy, która uwidacznia interfejs oczekiwany przez obiekt ObjectDataSource, a następnie wewnętrznie wywołuje metodę FindUsersByName . Inną opcją — i używaną w tym artykule — jest utworzenie własnego interfejsu stronicowania i użycie go zamiast wbudowanego interfejsu stronicowania gridView.

Tworzenie pierwszego, poprzedniego, następnego, ostatniego interfejsu stronicowania

Skompilujmy interfejs stronicowania przy użyciu elementów First, Previous, Next i Last LinkButtons. Po kliknięciu przycisku First LinkButton nastąpi przejście użytkownika na pierwszą stronę danych, natomiast element Previous zwróci go do poprzedniej strony. Analogicznie, odpowiednio na następnej i ostatniej stronie użytkownik zostanie przeniesiony do następnej i ostatniej strony. Dodaj cztery kontrolki LinkButton poniżej kontrolki UserAccounts GridView.

<p>
 <asp:LinkButton ID="lnkFirst" runat="server"> First</asp:LinkButton> |
 <asp:LinkButton ID="lnkPrev" runat="server">  Prev</asp:LinkButton>|
 <asp:LinkButton ID="lnkNext" runat="server">Next  </asp:LinkButton>|
 <asp:LinkButton ID="lnkLast" runat="server">Last  </asp:LinkButton>
</p>

Następnie utwórz procedurę obsługi zdarzeń dla każdego zdarzenia LinkButton Click .

Rysunek 7 przedstawia cztery elementy LinkButton podczas przeglądania za pomocą widoku Projektowania dla deweloperów sieci Web w programie Visual Web.

Dodaj pozycje First ( Pierwszy), Previous (Poprzedni), Next (Dalej) i Last LinkButtons (Pod kontrolką GridView)

Rysunek 7. Dodawanie elementów First, Previous, Next i Last LinkButtons Pod kontrolką GridView (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Śledzenie bieżącego indeksu strony

Gdy użytkownik po raz pierwszy odwiedzi ManageUsers.aspx stronę lub kliknie jeden z przycisków filtrowania, chcemy wyświetlić pierwszą stronę danych w siatce. Gdy użytkownik kliknie jeden z elementów nawigacyjnych LinkButtons, musimy jednak zaktualizować indeks strony. Aby zachować indeks strony i liczbę rekordów do wyświetlenia na stronę, dodaj następujące dwie właściwości do klasy kodowej strony:

private int PageIndex
{
 get
 {
 object o = ViewState["PageIndex"];
 if (o == null)
 return 0;
 else
 return (int)o;
 }
 set
 {
 ViewState["PageIndex"] = value;
 }
}

private int PageSize
{
 get
 {
 return 10;
 }
}

UsernameToMatch Podobnie jak właściwość, PageIndex właściwość utrzymuje swoją wartość, aby wyświetlić stan. Właściwość tylko do PageSize odczytu zwraca zakodowaną wartość 10. Zachęcam czytelnika do zaktualizowania tej właściwości tak, aby korzystał z tego samego wzorca co PageIndex, a następnie rozszerzyć ManageUsers.aspx stronę tak, aby osoba odwiedzająca stronę mogła określić liczbę kont użytkowników do wyświetlenia na stronę.

Pobieranie rekordów bieżącej strony, aktualizowanie indeksu strony oraz włączanie i wyłączanie linków interfejsu stronicowania

Po dodaniu interfejsu stronicowania i PageIndex właściwości można PageSize przystąpić do aktualizowania BindUserAccounts metody tak, aby korzystała z odpowiedniego FindUsersByName przeciążenia. Ponadto musimy włączyć lub wyłączyć interfejs stronicowania w zależności od wyświetlanej strony. Podczas wyświetlania pierwszej strony danych należy wyłączyć linki Pierwsze i Poprzednie; Następne i Ostatnie powinny być wyłączone podczas wyświetlania ostatniej strony.

Zaktualizuj metodę BindUserAccounts przy użyciu następującego kodu:

private void BindUserAccounts()
{
 int totalRecords;
 UserAccounts.DataSource = Membership.FindUsersByName(this.UsernameToMatch + "%",this.PageIndex, this.PageSize, out totalRecords);
 UserAccounts.DataBind();

 // Enable/disable the paging interface
 bool visitingFirstPage = (this.PageIndex == 0);
 lnkFirst.Enabled = !visitingFirstPage;
 lnkPrev.Enabled = !visitingFirstPage;

 int lastPageIndex = (totalRecords - 1) / this.PageSize;
 bool visitingLastPage = (this.PageIndex >= lastPageIndex);
 lnkNext.Enabled = !visitingLastPage;
 lnkLast.Enabled = !visitingLastPage;
}

Należy pamiętać, że łączna liczba rekordów stronicowanych za pośrednictwem jest określana przez ostatni parametr FindUsersByName metody. Jest to out parametr, dlatego musimy najpierw zadeklarować zmienną do przechowywania tej wartości (totalRecords), a następnie prefiksować ją za pomocą słowa kluczowego out .

Po zwróceniu określonej strony kont użytkowników cztery przyciski LinkButton są włączone lub wyłączone, w zależności od tego, czy pierwsza lub ostatnia strona danych jest przeglądana.

Ostatnim krokiem jest napisanie kodu dla czterech programów obsługi zdarzeń LinkButtons Click . Te procedury obsługi zdarzeń muszą zaktualizować PageIndex właściwość, a następnie ponownie połączyć dane z kontrolką GridView za pośrednictwem wywołania metody BindUserAccounts. Procedury obsługi zdarzeń Pierwsze, Poprzednie i Następne są bardzo proste. Procedura Click obsługi zdarzeń dla elementu Last LinkButton jest jednak nieco bardziej złożona, ponieważ musimy określić, ile rekordów jest wyświetlanych w celu określenia ostatniego indeksu strony.

protected void lnkFirst_Click(object sender, EventArgs e)
{
 this.PageIndex = 0;
 BindUserAccounts();
}

protected void lnkPrev_Click(object sender, EventArgs e)
{
 this.PageIndex -= 1;
 BindUserAccounts();
}

protected void lnkNext_Click(object sender, EventArgs e)
{
 this.PageIndex += 1;
 BindUserAccounts();
}

protected void lnkLast_Click(object sender, EventArgs e)
{
 // Determine the total number of records
 int totalRecords;
 Membership.FindUsersByName(this.UsernameToMatch + "%", this.PageIndex,this.PageSize, out totalRecords);
 // Navigate to the last page index
 this.PageIndex = (totalRecords - 1) / this.PageSize;
 BindUserAccounts();
}

Na rysunkach 8 i 9 pokazano niestandardowy interfejs stronicowania w akcji. Rysunek 8 przedstawia ManageUsers.aspx stronę podczas wyświetlania pierwszej strony danych dla wszystkich kont użytkowników. Należy pamiętać, że wyświetlane są tylko 10 z 13 kont. Kliknięcie linku Dalej lub Ostatnie powoduje wycofanie, zaktualizowanie PageIndex wartości do 1 i powiązanie drugiej strony kont użytkowników z siatką (zobacz Rysunek 9).

Wyświetlane są pierwsze 10 kont użytkowników

Rysunek 8. Wyświetlane są pierwsze 10 kont użytkowników (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Kliknięcie linku Dalej powoduje wyświetlenie drugiej strony kont użytkowników

Rysunek 9. Kliknięcie następnego linku powoduje wyświetlenie drugiej strony kont użytkowników (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Podsumowanie

Administratorzy często muszą wybrać użytkownika z listy kont. W poprzednich samouczkach przyjrzeliśmy się używaniu listy rozwijanej wypełnionej użytkownikami, ale takie podejście nie jest dobrze skalowane. W tym samouczku poznaliśmy lepszą alternatywę: interfejs z możliwością filtrowania, którego wyniki są wyświetlane w stronicowanym obiekcie GridView. Dzięki temu interfejsowi użytkownika administratorzy mogą szybko i skutecznie lokalizować i wybierać jedno konto użytkownika spośród tysięcy.

Szczęśliwe programowanie!

Dalsze informacje

Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:

Informacje o autorze

Scott Mitchell, autor wielu 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. Scott można dotrzeć pod mitchell@4guysfromrolla.com adresem lub za pośrednictwem swojego bloga pod adresem http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. Głównym recenzentem tego samouczka była Alicja Maziarz. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi linię na mitchell@4GuysFromRolla.com