연습: Silverlight 비즈니스 응용 프로그램에서 데이터 표시

WCF RIA Services

이 연습에서는 두 개의 다른 Silverlight 페이지에 AdventureWorks 샘플 데이터베이스의 데이터를 표시하는 Silverlight 비즈니스 응용 프로그램을 만듭니다. 첫 번째 페이지에서는 SalesOrderHeader 테이블의 데이터를 표시하고 데이터베이스 레코드를 통해 페이지에 대한 지원을 제공합니다. 두 번째 페이지에서는 사용자가 날짜를 기준으로 쿼리를 실행할 수 있습니다.

이 연습에서는 다음 작업을 수행합니다.

  • Silverlight 클라이언트와 ASP.NET 웹 응용 프로그램이라는 두 가지 프로젝트로 구성된 Silverlight 비즈니스 응용 프로그램 만들기

  • 리소스 문자열을 수정하여 응용 프로그램 이름 변경

  • 데이터베이스 파일을 기준으로 엔터티 데이터 모델 만들기

  • 엔터티 데이터 모델의 데이터를 Silverlight 클라이언트에 노출하는 도메인 서비스 만들기. 자세한 내용은 도메인 서비스를 참조하십시오.

  • 사용자 지정 쿼리를 수정하여 도메인 서비스에 추가

  • 사용자에게 데이터를 제공하는 추가 Silverlight 페이지 만들기

  • 기본 탐색 모음에 Silverlight 페이지에 액세스하는 단추 추가

  • 데이터 소스 창에서 Silverlight Designer로 항목을 끌어서 데이터를 표시하도록 Silverlight 페이지 구성

  • 데이터 정렬 및 페이징

  • 쿼리 매개 변수를 사용하도록 사용자 인터페이스 구성

WCF RIA Services 설명서에서 제공하는 이 연습 및 다른 연습을 실행하려면 WCF RIA Services 및 WCF RIA Services 도구 키트 외에도 Visual Studio 2010, Silverlight Developer 런타임 및 SDK 등의 몇 가지 필수 구성 요소 프로그램을 올바르게 설치하고 구성해야 합니다. 또한 SQL Server 2008 R2 Express with Advanced Services를 설치하고 구성해야 하며 AdventureWorks OLTP 및 LT 데이터베이스를 설치해야 합니다.

이러한 각 사전 요구 사항을 충족하기 위한 자세한 지침은 WCF RIA Services의 사전 요구 사항 노드의 항목에서 제공합니다. 이 RIA Services 연습을 수행할 때 발생할 수 있는 문제를 최소화하려면 이 연습을 진행하기 전에 여기서 제공하는 지침을 따르십시오.

이 연습에서는 사용자가 Silverlight 비즈니스 응용 프로그램을 만들 수 있다고 가정합니다. 이 작업을 수행하는 절차는 연습: Silverlight 비즈니스 응용 프로그램 템플릿 사용에서 설명합니다.

Silverlight 비즈니스 응용 프로그램은 Silverlight 응용 프로그램을 호스팅하는 ASP.NET 웹 응용 프로그램과 Silverlight 응용 프로그램이라는 두 프로젝트를 포함하는 솔루션입니다. Silverlight 비즈니스 응용 프로그램에는 기본 제공 기능이 있으며 기본적으로 홈 페이지, 정보 페이지, 탐색 모음 및 사이트 등록 기능이 있습니다. 기본 응용 프로그램 이름도 응용 프로그램 이름으로 변경하는 리소스 문자열로 제공됩니다.

응용 프로그램을 만들려면

  1. Visual Studio 2010에서 AdventureWorksApp라는 Visual Basic 또는 C#의 새 Silverlight 비즈니스 응용 프로그램 프로젝트를 만듭니다. 이 작업을 수행하는 절차는 연습: Silverlight 비즈니스 응용 프로그램 템플릿 사용에서 설명합니다.

    AdventureWorksApp Silverlight 프로젝트와 AdventureWorksApp.Web 웹 응용 프로그램 프로젝트라는 두 프로젝트로 AdventureWorksApp 솔루션이 만들어집니다.

  2. 솔루션 탐색기에서 AdventureWorksApp 프로젝트를 확장합니다.

  3. Assets 폴더를 확장한 다음 Resources를 확장합니다.

  4. ApplicationStrings.resx를 두 번 클릭하여 리소스 디자이너를 엽니다.

  5. ApplicationName 리소스 문자열 Adventure Works Application으로 변경합니다.

  6. 변경 내용을 저장하고 ApplicationStrings.resx 파일을 닫습니다.

  7. 응용 프로그램을 실행합니다.

    홈 페이지가 열리고 업데이트된 응용 프로그램 이름이 포함된 기본 디자인이 표시됩니다.

응용 프로그램에서 데이터를 관리하려면 엔터티 데이터 모델을 사용합니다.

엔터티 데이터 모델을 만들려면

  1. 솔루션 탐색기에서 AdventureWorksApp.Web을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

    새 항목 추가 대화 상자가 나타납니다.

  2. 데이터 범주에서 ADO.NET 엔터티 데이터 모델 템플릿을 클릭합니다.

    RIADisplayingData01EDMX
  3. 이름을 AdventureWorksEDM.edmx로 변경하고 추가를 클릭합니다.

    엔터티 데이터 모델 마법사가 열립니다.

  4. 모델 콘텐츠 선택 페이지에서 데이터베이스에서 생성을 클릭하고 다음을 클릭합니다.

  5. 데이터 연결 선택 페이지에서 새 연결을 클릭합니다.

    연결 속성 대화 상자가 나타납니다.

  6. 데이터 소스로 사용할 Microsoft SQL Server 데이터베이스 파일을 선택하고 AdventureWorksLT 데이터베이스 파일의 위치를 지정합니다.

  7. 확인을 클릭합니다.

  8. 데이터 연결 선택 페이지에서 다음을 클릭합니다.

  9. 데이터베이스 파일을 프로젝트에 복사하고 연결을 수정할지를 묻는 메시지가 나타나면 를 클릭합니다.

  10. 데이터베이스 개체 선택 페이지에서 테이블 노드를 확장합니다.

  11. SalesOrderHeader (Sales LT) 테이블 옆에 확인 표시를 추가합니다.

  12. 마침을 클릭합니다.

    Entity Designer에 SalesOrderHeader 테이블이 나타납니다.

  13. 솔루션을 빌드합니다.

    도메인 서비스를 추가하기 전에 솔루션을 빌드해야 합니다.

도메인 서비스는 데이터 모델의 데이터 엔터티 및 작업을 클라이언트에 노출합니다. 이 절차에서는 도메인 서비스를 서비스 프로젝트에 추가합니다.

도메인 서비스를 만들려면

  1. 솔루션 탐색기에서 AdventureWorksApp.Web을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

    새 항목 추가 대화 상자가 나타납니다.

  2. 범주에서 도메인 서비스 클래스 템플릿을 클릭합니다.

  3. 도메인 서비스 클래스의 이름을 AdventureWorksService로 지정하고 추가를 클릭합니다.

    새 도메인 서비스 클래스 추가 대화 상자가 열립니다.

  4. SalesOrderHeader편집 사용 확인란을 선택한 다음 확인을 클릭합니다.

    RIADisplayingData02AddNewDomainServiceClass
  5. 솔루션을 빌드합니다.

도메인 서비스 클래스를 추가하면 쿼리 메서드로 해당 클래스가 채워집니다. 이러한 쿼리 메서드를 그대로 사용할 수도 있지만 대부분의 경우 약간의 수정이 필요합니다. 이 절차에서는 GetSalesOrderHeaders 쿼리 메서드를 편집합니다.

도메인 서비스 쿼리를 변경하려면

  1. 솔루션 탐색기에서 AdventureWorksService.vb 또는 AdventureWorksService.cs를 두 번 클릭하여 이 파일을 엽니다.

  2. 다음 코드와 같이 GetSalesOrderHeaders 메서드를 업데이트합니다.

    Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders.OrderBy(Function(e) e.SalesOrderID)
    End Function
    

    
    public IQueryable<SalesOrderHeader> GetSalesOrderHeaders()
    {
        return this.ObjectContext.SalesOrderHeaders.OrderBy(e=>e.SalesOrderID);
    }
    
    
  3. 솔루션을 빌드합니다.

이 절차에서는 OrderList 페이지를 추가하여 SalesOrderHeader 테이블의 데이터를 표시합니다.

Silverlight 페이지를 만들려면

  1. 솔루션 탐색기의 AdventureWorksApp 프로젝트에서 Views 폴더를 마우스 오른쪽 단추로 클릭하고 새 항목을 추가합니다.

  2. 새 항목 추가 대화 상자에서 Silverlight 범주를 선택한 다음 Silverlight 페이지 템플릿을 클릭합니다.

  3. 이름을 OrderList.xaml로 바꾸고 추가를 클릭합니다.

    디자이너에서 OrderList.xaml이 열립니다.

  4. 도구 상자에서 TextBlock을 디자이너 맨 위로 끌어옵니다.

  5. 속성 창에서 Text 속성을 주문 목록으로 변경합니다.

  6. OrderList.xaml 페이지를 저장합니다.

이 절차에서는 응용 프로그램의 홈 페이지에 OrderList 페이지로 이동하는 단추를 추가합니다.

탐색 단추를 만들려면

  1. 솔루션 탐색기에서 MainPage.xaml을 두 번 클릭하여 디자이너에서 이 파일을 엽니다.

  2. XAML 뷰에서 <HyperlinkButton x:Name="Link2" ... /> 줄 뒤에 다음 태그를 추가합니다.

    <Rectangle x:Name="Divider3" Style="{StaticResource DividerStyle}"/>
    <HyperlinkButton x:Name="Link3" Content="Order List" Style="{StaticResource LinkStyle}" NavigateUri="/OrderList" TargetName="ContentFrame"/>
    
    
  3. 응용 프로그램을 실행합니다.

    주문 목록 단추가 탐색 모음에 나타나야 합니다.

  4. 주문 목록 단추를 클릭합니다.

    OrderList 페이지가 나타납니다.

이 절차에서는 데이터 소스 창에서 디자이너로 주문 엔터티를 끌어서 주문 데이터를 표시하도록 DataGrid를 만들고 구성합니다.

데이터 바인딩된 DataGrid를 만들려면

  1. 솔루션 탐색기에서 OrderList.xaml을 두 번 클릭합니다.

  2. 데이터 메뉴를 클릭한 다음 데이터 소스 표시를 클릭합니다.

    데이터 소스 창이 열립니다. 데이터 소스 창에는 응용 프로그램에 사용할 수 있는 엔터티가 이미 포함되어 있습니다.

  3. 데이터 소스 창에서 디자이너의 주문 목록 텍스트 블록 아래로 SalesOrderHeader 노드를 끌어옵니다.

    SalesOrderHeader 테이블의 열 제목으로 채워진 DataGrid가 디자인 화면에 나타납니다.

    RIADisplayingData03OrderListPageWithDataGrid
  4. 응용 프로그램을 실행합니다.

  5. 탐색 모음에서 주문 목록 단추를 클릭합니다.

    주문 목록 페이지에 주문 데이터가 표시됩니다.

    RIADisplayingData04OrderListPageWithDataGridComple

도메인 서비스에서 추가 쿼리를 만들 수 있습니다. 이 절차에서는 두 가지 사용자 지정 쿼리를 추가합니다.

도메인 서비스에 사용자 지정 쿼리를 추가하려면

  1. 솔루션 탐색기에서 AdventureWorksService.vb 또는 AdventureWorksService.cs를 두 번 클릭합니다.

  2. 다음 메서드를 AdventureWorksService 클래스에 추가합니다.

    Public Function GetOrdersWithSmallSubtotals() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders.Where(Function(p) p.SubTotal <= 2000).OrderBy(Function(p) p.SubTotal)
    End Function
    
    Public Function GetShipDateBefore(ByVal shipDate As DateTime) As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders.Where(Function(p) p.ShipDate < shipDate).OrderBy(Function(p) p.SalesOrderID)
    End Function
    

    public IQueryable<SalesOrderHeader> GetOrdersWithSmallSubtotals()
    {
        return this.ObjectContext.SalesOrderHeaders.Where(e => e.SubTotal <= 2000).OrderBy(e => e.SubTotal);
    }
    
    public IQueryable<SalesOrderHeader> GetShipDateBefore(DateTime shipDate)
    {
        return this.ObjectContext.SalesOrderHeaders.Where(e => e.ShipDate < shipDate).OrderBy(e => e.SalesOrderID);
    }
    
    
  3. Visual Basic을 사용하는 경우 AdventureWorksService.vb 파일의 맨 위에서 Option Strict 문을 Off로 설정합니다.

  4. 솔루션을 빌드합니다.

이 절차에서는 데이터 소스 창에서 쿼리를 선택하고 디자이너에 이미 있는 DataGrid로 쿼리를 끌어 새 쿼리의 데이터를 표시합니다. 이렇게 하면 선택한 쿼리의 데이터를 표시하도록 DataGrid의 바인딩이 다시 구성됩니다.

기존 DataGrid에 사용자 지정 쿼리의 데이터를 표시하려면

  1. 솔루션 탐색기에서 OrderList.xaml을 두 번 클릭합니다.

  2. 데이터 소스 창에서 SalesOrderHeader를 클릭한 다음 드롭다운 메뉴를 클릭합니다.

    RIADisplayingData05QueriesInDataSources

    세 가지 쿼리가 메뉴 맨 아래에 나열됩니다. 확인 표시된 쿼리는 이 엔터티를 디자이너로 끌어온 후 생성된 데이터 소스의 QueryName에 설정할 쿼리입니다.

  3. 쿼리 목록에서 GetOrdersWithSmallSubtotalsQuery를 선택하여 이 엔터티의 쿼리로 설정합니다.

  4. SalesOrderHeader 노드를 디자이너의 기존 DataGrid로 끌어옵니다.

  5. 응용 프로그램을 실행합니다.

  6. 주문 목록 단추를 클릭합니다.

    DataGrid에 나열된 주문 부분합이 2000을 초과하지 않음을 확인합니다.

    RIADisplayingData06SmallSubtotalsQueryResult

기본 쿼리에서 OrderBy 절을 사용하여 데이터를 정렬할 수 있을 뿐 아니라 페이지의 XAML에서 정렬을 구성할 수도 있습니다. SortDescriptorsDomainDataSource에 추가하여 정렬을 구성합니다. 다음 절차와 같이 속성 창을 사용하거나 XAML에서 직접 SortDescriptors를 추가할 수 있습니다.

속성 창을 사용하여 SortDescriptors를 추가하려면

  1. 솔루션 탐색기에서 OrderList.xaml을 두 번 클릭합니다.

  2. XAML 뷰에서 Name 특성이 salesOrderHeaderDomainDataSource1로 설정된 riaControls:DomainDataSource 요소에 커서를 놓습니다.

    Warning 주의:
    파일에 두 가지 riaControls:DomainDataSource 요소가 있습니다. Name 특성이 salesOrderHeaderDomainDataSource1로 설정된 요소에 마우스를 놓아야 합니다.

  3. 속성 창에서 SortDescriptors 속성을 클릭한 다음 줄임표 단추()를 클릭합니다.

    RIADisplayingData07SortDescriptorsProperty

    ortDescriptors 컬렉션 편집기가 나타납니다.

  4. 추가를 클릭합니다.

    SortDescriptors 항목이 추가됩니다.

  5. 속성 아래에서 기타 범주를 확장합니다.

  6. PropertyPath 값 열에 CustomerID를 입력합니다.

  7. 확인을 클릭합니다.

    다음 XAML이 riaControls:DomainDataSource 요소에 추가되었습니다.

    <riaControls:DomainDataSource.SortDescriptors>
        <riaControls:SortDescriptor PropertyPath="CustomerID" />
    </riaControls:DomainDataSource.SortDescriptors>
    
  8. 응용 프로그램을 실행합니다.

  9. 주문 목록 단추를 클릭합니다.

    데이터가 목록의 Customer ID를 기준으로 정렬됨을 확인합니다.

    RIADisplayingData09SortedByCustomerID
    Warning 주의:
    페이징과 정렬을 함께 구현하는 경우 해당 PropertyPath 특성이 기본 키 등의 고유 값을 포함하는 속성에 할당된 하나 이상의 SortDescriptor를 포함합니다. 또는 고유 값을 포함하는 속성을 기준으로 하는 OrderBy 절을 DomainDataSource의 쿼리에 추가합니다. 고유 값을 포함하지 않은 속성의 데이터만 정렬하는 경우 여러 페이지에서 일관되지 않거나 누락된 데이터가 반환 값에 포함될 수 있습니다.

이 절차에서는 데이터 소스에 DataPager를 추가하여 페이징을 추가합니다. 페이저가 제어해야 하는 데이터를 관리하는 DomainDataSourceDataPager.Source를 설정합니다.

데이터의 페이징을 구성하려면

  1. 솔루션 탐색기에서 OrderList.xaml을 두 번 클릭합니다.

  2. 도구 상자에서 DataPager 컨트롤을 찾습니다.

  3. DataPagerDataGrid 아래의 디자이너 영역으로 끌어옵니다.

  4. 데이터 소스 창에서 SalesOrderHeader 노드를 클릭하고 드롭다운 메뉴를 클릭한 다음 GetOrdersWithSmallSubtotalsQuery가 선택되어 있는지 확인합니다.

  5. SalesOrderHeader 노드를 DataPager로 끌어옵니다.

    그러면 DataPager의 Source 속성이 올바른 데이터 소스로 설정됩니다.

  6. 디자이너에서 DataPager를 선택합니다.

  7. 속성 창에서 PageSize 속성을 5로 설정합니다.

  8. 응용 프로그램을 실행합니다.

  9. 주문 목록 단추를 클릭합니다.

  10. DataPager에서 탐색 단추를 클릭하여 DataGrid에서 한 번에 5개의 레코드를 탐색합니다.

    RIADisplayingData10OrderListPageComplete

이 연습 앞부분에서는 운송 날짜가 사용자 제공 날짜 이전인 주문을 반환하는 도메인 서비스에 사용자 지정 쿼리를 추가했습니다. 이 절차에서는 데이터 소스 창에서 도메인 서비스 쿼리로 전달되는 사용자 제공 매개 변수를 사용하는 사용자 인터페이스를 만드는 방법을 보여 줍니다.

사용자 인터페이스를 만들려면

  1. AdventureWorksApp 프로젝트의 Views 폴더에서 OrderSearchByShipDateBefore.xaml이라는 새 Silverlight 페이지를 추가합니다.

  2. 솔루션 탐색기에서 MainPage.xaml을 두 번 클릭합니다.

  3. XAML 뷰에서 <HyperlinkButton x:Name="Link3" ... /> 줄 뒤에 다음 코드를 추가합니다.

    <Rectangle x:Name="Divider4" Style="{StaticResource DividerStyle}"/>
    <HyperlinkButton x:Name="Link4" Content="Ship Date" Style="{StaticResource LinkStyle}" NavigateUri="/OrderSearchByShipDateBefore" TargetName="ContentFrame"/>
    
    
  4. 솔루션 탐색기에서 OrderSearchByShipDateBefore.xaml을 두 번 클릭합니다.

  5. 데이터 소스 창에서 SalesOrderHeader 노드를 클릭한 다음 드롭다운 메뉴를 클릭합니다.

  6. GetShipDateBeforeQuery를 선택하여 이 엔터티의 쿼리로 설정합니다.

    RIADisplayingData11DataSourcesGetShipDateBeforeQue
  7. SalesOrderHeader 노드를 디자이너로 끌어옵니다.

    DataGrid 외에도 쿼리의 매개 변수를 받아들이는 텍스트 상자가 만들어지며, 쿼리를 실행하고 데이터를 로드하는 단추가 추가됩니다.

    RIADisplayingData12ShipDateQueryOnDesigner

이 절차에서는 응용 프로그램을 빌드하고 실행하여 응용 프로그램이 예상대로 동작하는지 확인합니다.

응용 프로그램을 테스트하려면

  1. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.

    솔루션이 오류 없이 빌드되는지 확인합니다.

  2. 응용 프로그램을 실행합니다.

  3. 운송 날짜 단추를 클릭하여 운송 날짜 쿼리가 있는 페이지를 엽니다.

  4. 운송 날짜 상자에 날짜(예: 1/1/2006)를 입력합니다.

  5. 로드를 클릭합니다.

    지정된 날짜 이전의 운송 날짜만 반환됩니다.

    RIADisplayingData13ShipDateQueryComplete
  6. 다른 운송 날짜로도 응용 프로그램을 테스트해 봅니다.

이 연습을 완료하면 다음과 같은 관련 작업을 수행할 수 있습니다.

표시: