다음을 통해 공유


여러 사용자 계정 중 하나를 선택하는 인터페이스 빌드(C#)

작성자 : Scott Mitchell

이 자습서에서는 필터링 가능한 페이징된 그리드를 사용하여 사용자 인터페이스를 빌드합니다. 특히 사용자 인터페이스는 사용자 이름의 시작 문자에 따라 결과를 필터링하기 위한 일련의 LinkButtons와 일치하는 사용자를 표시하는 GridView 컨트롤로 구성됩니다. 먼저 GridView에 모든 사용자 계정을 나열합니다. 그런 다음, 3단계에서 LinkButtons 필터를 추가합니다. 4단계에서는 필터링된 결과 페이징을 살펴봅합니다. 2~4단계에서 생성된 인터페이스는 후속 자습서에서 특정 사용자 계정에 대한 관리 작업을 수행하는 데 사용됩니다.

소개

사용자에게 역할 할당 자습서에서는 관리자가 사용자를 선택하고 역할을 관리할 수 있는 기본적인 인터페이스를 만들었습니다. 특히 인터페이스는 관리자에게 모든 사용자의 드롭다운 목록을 표시했습니다. 이러한 인터페이스는 12개 정도의 사용자 계정이 있지만 수백 또는 수천 개의 계정이 있는 사이트에는 다루기 어려운 경우에 적합합니다. 필터링 가능한 페이징된 그리드는 사용자 기반이 큰 웹 사이트에 더 적합한 사용자 인터페이스입니다.

이 자습서에서는 이러한 사용자 인터페이스를 빌드합니다. 특히 사용자 인터페이스는 사용자 이름의 시작 문자에 따라 결과를 필터링하기 위한 일련의 LinkButtons와 일치하는 사용자를 표시하는 GridView 컨트롤로 구성됩니다. 먼저 GridView에 모든 사용자 계정을 나열합니다. 그런 다음, 3단계에서 LinkButtons 필터를 추가합니다. 4단계에서는 필터링된 결과 페이징을 살펴봅합니다. 2~4단계에서 생성된 인터페이스는 후속 자습서에서 특정 사용자 계정에 대한 관리 작업을 수행하는 데 사용됩니다.

그럼 시작하겠습니다.

1단계: 새 ASP.NET 페이지 추가

이 자습서와 다음 두 자습서에서는 다양한 관리 관련 기능 및 기능을 살펴보겠습니다. 이러한 자습서 전체에서 검사된 topics 구현하려면 일련의 ASP.NET 페이지가 필요합니다. 이러한 페이지를 만들고 사이트 맵을 업데이트해 보겠습니다.

먼저 라는 Administration프로젝트에 새 폴더를 만듭니다. 다음으로 폴더에 두 개의 새 ASP.NET 페이지를 추가하여 각 페이지를 master 페이지와 Site.master 연결합니다. 페이지 이름을 지정합니다.

  • ManageUsers.aspx
  • UserInformation.aspx

또한 웹 사이트의 루트 디렉터리인 및 RecoverPassword.aspx에 두 페이지를 추가합니다ChangePassword.aspx.

이 4페이지에는 두 개의 콘텐츠 컨트롤이 있어야 합니다. 하나는 master 페이지의 ContentPlaceHolders 각각에 대해 하나씩, 및 LoginContent입니다MainContent.

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

이러한 페이지의 ContentPlaceHolder에 대한 LoginContent master 페이지의 기본 태그를 표시하려고 합니다. 따라서 콘텐츠 컨트롤에 대한 선언적 태그를 Content2 제거합니다. 이렇게 하면 페이지의 태그에 콘텐츠 컨트롤이 하나만 포함되어야 합니다.

폴더의 Administration ASP.NET 페이지는 관리 사용자만을 위한 것입니다. 역할 만들기 및 관리 자습서에서 관리자 역할을 시스템에 추가했습니다. 이 두 페이지에 대한 액세스를 이 역할로 제한합니다. 이렇게 하려면 폴더에 Web.configAdministration 파일을 추가하고 관리자 역할에서 사용자를 허용하고 다른 모든 사용자를 거부하도록 해당 요소를 구성 <authorization> 합니다.

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

이 시점에서 프로젝트의 솔루션 탐색기 그림 1에 표시된 스크린샷과 유사하게 표시됩니다.

새 페이지 4개와 Web.config 파일이 웹 사이트에 추가되었습니다.

그림 1: 4개의 새 페이지와 Web.config 파일이 웹 사이트에 추가되었습니다(전체 크기 이미지를 보려면 클릭).

마지막으로 페이지 항목을 포함하도록 사이트 맵(Web.sitemap)을 업데이트합니다 ManageUsers.aspx . 역할 자습서에 대해 추가한 <siteMapNode> 다음에 다음 XML을 추가합니다.

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

사이트 맵이 업데이트되면 브라우저를 통해 사이트를 방문합니다. 그림 2에서 볼 수 있듯이 왼쪽의 탐색에는 이제 관리 자습서에 대한 항목이 포함됩니다.

사이트 맵에는 사용자 관리라는 노드가 포함됩니다.

그림 2: 사이트 맵에 사용자 관리라는 노드가 포함되어 있습니다(전체 크기 이미지를 보려면 클릭).

2단계: GridView에 모든 사용자 계정 나열

이 자습서의 최종 목표는 관리자가 관리할 사용자 계정을 선택할 수 있는 필터링 가능한 페이징 그리드를 만드는 것입니다. 먼저 GridView의 모든 사용자를 나열해 보겠습니다. 이 작업이 완료되면 필터링 및 페이징 인터페이스 및 기능을 추가합니다.

폴더에서 ManageUsers.aspxAdministration 페이지를 열고 GridView를 추가하여 으로 UserAccounts설정합니다ID. 잠시 후 클래스 GetAllUsers 의 메서드를 사용하여 Membership 사용자 계정 집합을 GridView에 바인딩하는 코드를 작성합니다. 이전 자습서에서 설명한 대로 GetAllUsers 메서드는 개체 컬렉션 MembershipUser 인 개체를 반환 MembershipUserCollection 합니다. 컬렉션의 각 MembershipUser 속성에는 , Email, IsApproved등과 같은 UserName속성이 포함됩니다.

GridView에서 원하는 사용자 계정 정보를 표시하려면 GridView의 AutoGenerateColumns 속성을 False로 설정하고 , Email및 속성에 대한 UserNameBoundFields 및 Comment , IsLockedOutIsOnline 및 속성에 대한 IsApprovedCheckBoxFields를 추가합니다. 이 구성은 컨트롤의 선언적 태그 또는 필드 대화 상자를 통해 적용할 수 있습니다. 그림 3에서는 필드 자동 생성 확인란이 선택 취소되고 BoundFields 및 CheckBoxFields가 추가되고 구성된 후 필드 대화 상자의 스크린샷을 보여 줍니다.

GridView에 3개의 BoundFields 및 3개의 CheckBoxFields 추가

그림 3: GridView에 3개의 BoundFields 및 3개의 CheckBoxFields 추가(전체 크기 이미지를 보려면 클릭)

GridView를 구성한 후 선언적 태그가 다음과 유사한지 확인합니다.

<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>

다음으로, 사용자 계정을 GridView에 바인딩하는 코드를 작성해야 합니다. 라는 BindUserAccounts 메서드를 만들어 이 작업을 수행한 다음 첫 번째 페이지 방문의 Page_Load 이벤트 처리기에서 호출합니다.

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

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

잠시 시간을 내어 브라우저를 통해 페이지를 테스트합니다. 그림 4와 UserAccounts 같이 GridView는 시스템의 모든 사용자에 대한 사용자 이름, 이메일 주소 및 기타 관련 계정 정보를 나열합니다.

사용자 계정은 GridView에 나열됩니다.

그림 4: 사용자 계정이 GridView에 나열됩니다(전체 크기 이미지를 보려면 클릭).

3단계: 사용자 이름의 첫 글자를 기준으로 결과 필터링

현재 GridView에는 UserAccounts모든 사용자 계정이 표시됩니다. 수백 또는 수천 개의 사용자 계정이 있는 웹 사이트의 경우 사용자가 표시된 계정을 신속하게 분석할 수 있어야 합니다. 이 작업은 페이지에 LinkButtons 필터링을 추가하여 수행할 수 있습니다. 페이지에 27개의 LinkButtons를 추가해 보겠습니다. 하나는 모두라는 제목과 알파벳의 각 문자에 대해 하나의 LinkButton입니다. 방문자가 All LinkButton을 클릭하면 GridView에 모든 사용자가 표시됩니다. 특정 문자를 클릭하면 사용자 이름이 선택한 문자로 시작하는 사용자만 표시됩니다.

첫 번째 작업은 27개의 LinkButton 컨트롤을 추가하는 것입니다. 한 가지 옵션은 한 번에 하나씩 선언적으로 27개의 LinkButtons를 만드는 것입니다. 보다 유연한 방법은 LinkButton을 렌더링한 ItemTemplate 다음 필터링 옵션을 Repeater에 배열로 바인딩하는 와 함께 Repeater 컨트롤을 string 사용하는 것입니다.

먼저 GridView 위의 페이지에 Repeater 컨트롤을 UserAccounts 추가합니다. Repeater의 ID 속성을 로 FilteringUI설정합니다. 및 속성이 현재 배열 요소에 ItemTemplate 바인딩된 LinkButton TextCommandName 을 렌더링하도록 Repeater의 템플릿을 구성합니다. 사용자에게 역할 할당 자습서에서 확인한 것처럼 데이터 바인딩 구문을 사용하여 Container.DataItem 이 작업을 수행할 수 있습니다. 반복기를 SeparatorTemplate 사용하여 각 링크 사이에 세로 선을 표시합니다.

<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>

이 반복기를 원하는 필터링 옵션으로 채려면 라는 BindFilteringUI메서드를 만듭니다. 첫 번째 페이지 로드의 Page_Load 이벤트 처리기에서 이 메서드를 호출해야 합니다.

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

이 메서드는 배열filterOptions의 요소 string 로 필터링 옵션을 지정합니다. 배열의 각 요소에 대해 Repeater는 배열 요소의 값에 할당된 및 CommandName 속성을 사용하여 Text LinkButton을 렌더링합니다.

그림 5는 브라우저를 ManageUsers.aspx 통해 볼 때의 페이지를 보여줍니다.

반복기 Lists 27 필터링 LinkButtons

그림 5: 반복기 Lists 27 필터링 LinkButtons(전체 크기 이미지를 보려면 클릭)

참고

사용자 이름은 숫자 및 문장 부호를 비롯한 모든 문자로 시작할 수 있습니다. 이러한 계정을 보려면 관리자가 All LinkButton 옵션을 사용해야 합니다. 또는 LinkButton을 추가하여 숫자로 시작하는 모든 사용자 계정을 반환할 수 있습니다. 나는 이것을 독자를위한 운동으로 남겨 둡니다.

LinkButtons 필터링을 클릭하면 포스트백이 발생하고 반복기의 ItemCommand 이벤트가 발생하지만 결과를 필터링하는 코드를 아직 작성하지 않았기 때문에 그리드에는 변경 사항이 없습니다. 클래스에는 Membership 사용자 이름이 지정된 검색 패턴과 일치하는 사용자 계정을 반환하는 메서드가 포함되어 FindUsersByName 있습니다. 이 메서드를 사용하여 사용자 이름이 클릭한 필터링된 LinkButton의 에서 지정한 CommandName 문자로 시작하는 사용자 계정만 검색할 수 있습니다.

라는 속성을 UsernameToMatch포함할 수 있도록 페이지의 코드 숨김 클래스를 업데이트 ManageUser.aspx 하여 시작합니다. 이 속성은 포스트백에서 사용자 이름 필터 문자열을 유지합니다.

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

속성은 UsernameToMatch UsernameToMatch 키를 사용하여 컬렉션에 ViewState 할당된 값을 저장합니다. 이 속성의 값을 읽으면 컬렉션에 ViewState 값이 있는지 확인합니다. 그렇지 않으면 기본값인 빈 문자열을 반환합니다. 속성은 UsernameToMatch 일반적인 패턴을 나타내며, 즉 속성을 변경한 내용이 포스트백 간에 유지되도록 상태를 보기 위해 값을 유지합니다. 이 패턴에 대한 자세한 내용은 ASP.NET 보기 상태 이해를 참조하세요.

다음으로, 를 호출하는 대신 SQL 와일드카드 문자 %가 추가된 속성의 UsernameToMatch 값을 전달하여 를 호출Membership.FindUsersByNameMembership.GetAllUsers할 수 있도록 메서드를 업데이트 BindUserAccounts 합니다.

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

사용자 이름이 문자 A로 시작하는 사용자만 표시하려면 속성을 A로 설정한 UsernameToMatch 다음 를 호출 BindUserAccounts합니다. 이렇게 하면 를 호출하여 Membership.FindUsersByName("A%")사용자 이름이 A로 시작하는 모든 사용자를 반환합니다. 마찬가지로 모든 사용자를 반환하려면 메서드가 를 호출Membership.FindUsersByName("%")하도록 UsernameToMatch 속성 BindUserAccounts 에 빈 문자열을 할당하여 모든 사용자 계정을 반환합니다.

Repeater의 이벤트에 대한 이벤트 처리기를 ItemCommand 만듭니다. 이 이벤트는 LinkButtons 필터 중 하나를 클릭할 때마다 발생합니다. 클릭된 LinkButton의 CommandName 값이 개체를 RepeaterCommandEventArgs 통해 전달됩니다. 속성에 적절한 값을 할당한 UsernameToMatch 다음 메서드를 BindUserAccounts 호출해야 합니다. 가 CommandName All이면 모든 사용자 계정이 표시되도록 에 빈 문자열 UsernameToMatch 을 할당합니다. 그렇지 않으면 값을 에 CommandName 할당합니다 UsernameToMatch.

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

이 코드를 사용하여 필터링 기능을 테스트합니다. 페이지를 처음 방문하면 모든 사용자 계정이 표시됩니다(그림 5 참조). A LinkButton을 클릭하면 포스트백이 발생하고 결과를 필터링하여 A로 시작하는 사용자 계정만 표시합니다.

Filtering LinkButtons를 사용하여 사용자 이름이 특정 문자로 시작하는 사용자를 표시합니다.

그림 6: Filtering LinkButtons를 사용하여 사용자 이름이 특정 문자로 시작하는 사용자를 표시합니다(전체 크기 이미지를 보려면 클릭).

4단계: 페이징을 사용하도록 GridView 업데이트

그림 5 및 6에 표시된 GridView에는 메서드에서 반환된 모든 레코드가 FindUsersByName 나열됩니다. 수백 또는 수천 개의 사용자 계정이 있는 경우 모든 계정을 볼 때 정보 오버로드가 발생할 수 있습니다(모든 LinkButton을 클릭하거나 처음 페이지를 방문할 때와 같이). 사용자 계정을 보다 관리하기 쉬운 청크로 표시하기 위해 GridView를 구성하여 한 번에 10개의 사용자 계정을 표시해 보겠습니다.

GridView 컨트롤은 다음과 같은 두 가지 유형의 페이징을 제공합니다.

  • 기본 페이징 - 구현하기 쉽지만 비효율적입니다. 간단히 말해서 기본 페이징을 사용하는 GridView는 데이터 원본의 모든 레코드를 예상합니다. 그런 다음 적절한 레코드 페이지만 표시합니다.
  • 사용자 지정 페이징 - 구현하는 데 더 많은 작업이 필요하지만 사용자 지정 페이징을 사용하면 데이터 원본이 표시할 정확한 레코드 집합만 반환하므로 기본 페이징보다 더 효율적입니다.

기본 페이징과 사용자 지정 페이징 간의 성능 차이는 수천 개 레코드를 페이징할 때 상당히 유용할 수 있습니다. 수백 또는 수천 개의 사용자 계정이 있을 수 있다고 가정하여 이 인터페이스를 빌드하고 있으므로 사용자 지정 페이징을 사용하겠습니다.

참고

기본 페이징과 사용자 지정 페이징의 차이점 및 사용자 지정 페이징 구현과 관련된 문제에 대한 자세한 내용은 많은 양의 데이터를 통해 효율적으로 페이징을 참조하세요.

사용자 지정 페이징을 구현하려면 먼저 GridView에서 표시하는 레코드의 정확한 하위 집합을 검색하는 몇 가지 메커니즘이 필요합니다. 좋은 소식은 Membership 클래스의 FindUsersByName 메서드에 페이지 인덱스 및 페이지 크기를 지정할 수 있는 오버로드가 있고 해당 레코드 범위에 속하는 사용자 계정만 반환한다는 것입니다.

특히 이 오버로드에는 다음과 같은 서명 FindUsersByName(usernameToMatch, pageIndex, pageSize, totalRecords)이 있습니다.

pageIndex 매개 변수는 반환할 사용자 계정의 페이지를 지정합니다. pageSize는 페이지당 표시할 레코드 수를 나타냅니다. totalRecords 매개 변수는 사용자 저장소의 총 사용자 계정 수를 반환하는 매개 변수입니다out.

참고

에서 FindUsersByName 반환된 데이터는 사용자 이름으로 정렬됩니다. 정렬 조건을 사용자 지정할 수 없습니다.

GridView는 사용자 지정 페이징을 활용하도록 구성할 수 있지만 ObjectDataSource 컨트롤에 바인딩된 경우에만 구성할 수 있습니다. ObjectDataSource 컨트롤이 사용자 지정 페이징을 구현하려면 두 가지 메서드가 필요합니다. 하나는 시작 행 인덱스와 표시할 최대 레코드 수를 전달하고 해당 범위에 속하는 레코드의 정확한 하위 집합을 반환합니다. 및 은 페이징되는 총 레코드 수를 반환하는 메서드입니다. 오버로드는 FindUsersByName 페이지 인덱스 및 페이지 크기를 허용하고 매개 변수를 통해 out 총 레코드 수를 반환합니다. 따라서 여기에 인터페이스가 일치하지 않습니다.

한 가지 옵션은 ObjectDataSource에서 예상하는 인터페이스를 노출한 다음 내부적으로 메서드를 호출하는 프록시 클래스를 FindUsersByName 만드는 것입니다. 이 문서에 사용할 또 다른 옵션은 자체 페이징 인터페이스를 만들고 GridView의 기본 제공 페이징 인터페이스 대신 사용하는 것입니다.

첫 번째, 이전, 다음, 마지막 페이징 인터페이스 만들기

First, Previous, Next 및 Last LinkButtons를 사용하여 페이징 인터페이스를 빌드해 보겠습니다. 첫 번째 LinkButton을 클릭하면 사용자가 데이터의 첫 번째 페이지로 이동되는 반면 Previous는 이전 페이지로 돌아갑니다. 마찬가지로 Next 및 Last는 사용자를 각각 다음 페이지와 마지막 페이지로 이동합니다. GridView 아래에 4개의 LinkButton 컨트롤을 UserAccounts 추가합니다.

<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>

다음으로 각 LinkButton Click 의 이벤트에 대한 이벤트 처리기를 만듭니다.

그림 7은 Visual Web Developer 디자인 보기를 통해 볼 때의 4개의 LinkButton을 보여 줍니다.

GridView 아래에 First, Previous, Next 및 Last LinkButtons 추가

그림 7: GridView 아래에 첫 번째, 이전, 다음 및 마지막 LinkButtons 추가(전체 크기 이미지를 보려면 클릭)

현재 페이지 인덱스 추적

사용자가 페이지를 처음 방문 ManageUsers.aspx 하거나 필터링 단추 중 하나를 클릭하면 GridView에 데이터의 첫 번째 페이지를 표시하려고 합니다. 그러나 사용자가 탐색 LinkButtons 중 하나를 클릭하면 페이지 인덱스를 업데이트해야 합니다. 페이지 인덱스와 페이지당 표시할 레코드 수를 유지하려면 페이지의 코드 숨김 클래스에 다음 두 속성을 추가합니다.

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 마찬가지로 속성은 PageIndex 상태를 보기 위해 해당 값을 유지합니다. 읽기 전용 PageSize 속성은 하드 코딩된 값 10을 반환합니다. 관심 있는 독자가 와 동일한 패턴을 PageIndex사용하도록 이 속성을 업데이트한 다음 페이지를 방문하는 사람이 페이지당 표시할 사용자 계정 수를 지정할 수 있도록 페이지를 보강 ManageUsers.aspx 하도록 초대합니다.

현재 페이지의 레코드 검색, 페이지 인덱스 업데이트 및 페이징 인터페이스 LinkButtons 사용 및 사용 안 함

페이징 인터페이스가 배치되고 및 PageSize 속성이 PageIndex 추가되면 적절한 FindUsersByName 오버로드를 사용하도록 메서드를 BindUserAccounts 업데이트할 준비가 된 것입니다. 또한 표시되는 페이지에 따라 이 메서드가 페이징 인터페이스를 사용하거나 사용하지 않도록 설정해야 합니다. 데이터의 첫 번째 페이지를 볼 때 첫 번째 및 이전 링크를 사용하지 않도록 설정해야 합니다. 마지막 페이지를 볼 때 다음 및 마지막을 사용하지 않도록 설정해야 합니다.

BindUserAccounts 메서드를 다음 코드로 업데이트합니다.

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

페이징되는 총 레코드 수는 메서드의 FindUsersByName 마지막 매개 변수에 의해 결정됩니다. 매개 변수이므로 out 먼저 변수를 선언하여 이 값(totalRecords)을 저장한 다음 키워드(keyword) 접두사를 지정해야 합니다 out .

사용자 계정의 지정된 페이지가 반환되면 데이터의 첫 번째 페이지 또는 마지막 페이지를 보는지 여부에 따라 4개의 LinkButton이 활성화되거나 비활성화됩니다.

마지막 단계는 4개의 LinkButtons Click 이벤트 처리기에 대한 코드를 작성하는 것입니다. 이러한 이벤트 처리기는 속성을 업데이트한 PageIndex 다음 에 대한 호출을 통해 GridView에 데이터를 다시 바인딩해야 합니다 BindUserAccounts. 첫 번째, 이전 및 다음 이벤트 처리기는 매우 간단합니다. Click 그러나 마지막 페이지 인덱스 확인에 표시할 레코드 수를 결정해야 하므로 Last LinkButton에 대한 이벤트 처리기는 좀 더 복잡합니다.

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

그림 8과 9는 작동 중인 사용자 지정 페이징 인터페이스를 보여 줍니다. 그림 8은 모든 사용자 계정에 대한 데이터의 첫 번째 페이지를 볼 때의 페이지를 보여 ManageUsers.aspx 줍니다. 13개 계정 중 10개만 표시됩니다. 다음 또는 마지막 링크를 클릭하면 포스트백이 발생하고, 을 1로 업데이트 PageIndex 하고, 사용자 계정의 두 번째 페이지를 그리드에 바인딩합니다(그림 9 참조).

처음 10개의 사용자 계정이 표시됩니다.

그림 8: 처음 10개의 사용자 계정이 표시됩니다(전체 크기 이미지를 보려면 클릭).

다음 링크를 클릭하면 사용자 계정의 두 번째 페이지가 표시됩니다.

그림 9: 다음 링크를 클릭하면 사용자 계정의 두 번째 페이지가 표시됩니다(전체 크기 이미지를 보려면 클릭).

요약

관리자는 계정 목록에서 사용자를 선택해야 하는 경우가 많습니다. 이전 자습서에서는 사용자로 채워진 드롭다운 목록을 사용하는 방법을 살펴보았지만 이 방법은 잘 확장되지 않습니다. 이 자습서에서는 더 나은 대안인 페이징된 GridView에 결과가 표시되는 필터링 가능한 인터페이스를 살펴보했습니다. 이 사용자 인터페이스를 사용하면 관리자는 수천 개의 사용자 계정을 빠르고 효율적으로 찾고 선택할 수 있습니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.

저자 정보

여러 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 설립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 사용하고 있습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 자신을 가르친다 ASP.NET 2.0 24 시간. Scott은 에서 mitchell@4guysfromrolla.com 또는 에서 자신의 블로그 http://ScottOnWriting.NET를 통해 연락할 수 있습니다.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Alicja Maziarz였습니다. 예정된 MSDN 문서를 검토하시겠습니까? 그렇다면 에서 줄을 놓습니다. mitchell@4GuysFromRolla.com