데이터를 기반으로 DataList 및 반복기 서식 지정(C#)

작성자 : Scott Mitchell

PDF 다운로드

이 자습서에서는 템플릿 내에서 형식 지정 함수를 사용하거나 DataBound 이벤트를 처리하여 DataList 및 Repeater 컨트롤의 모양에 형식을 지정하는 방법에 대한 예제를 단계별로 살펴보겠습니다.

소개

이전 자습서에서 살본 것처럼 DataList는 모양에 영향을 주는 다양한 스타일 관련 속성을 제공합니다. 특히 DataList의 HeaderStyle, , ItemStyleAlternatingItemStyleSelectedItemStyle 속성에 기본 CSS 클래스를 할당하는 방법을 알아보았습니다. 이러한 네 가지 속성 외에도 DataList에는 , , ForeColorBackColor및 와 BorderWidth같은 Font다양한 스타일 관련 속성이 포함되어 있습니다. 반복기 컨트롤에는 스타일 관련 속성이 없습니다. 이러한 스타일 설정은 반복기 템플릿의 태그 내에서 직접 설정해야 합니다.

하지만 데이터 형식을 지정하는 방법은 데이터 자체에 따라 달라지는 경우가 많습니다. 예를 들어 제품을 나열할 때 제품 정보가 중단된 경우 밝은 회색 글꼴 색으로 표시하거나 값이 0인 경우 강조 표시 UnitsInStock 할 수 있습니다. 이전 자습서에서 보았듯이 GridView, DetailsView 및 FormView는 데이터에 따라 모양 서식을 지정하는 두 가지 고유한 방법을 제공합니다.

  • 이벤트는 DataBound 데이터가 각 항목에 바인딩된 후 발생하는 적절한 DataBound 이벤트에 대한 이벤트 처리기를 만듭니다(GridView의 경우 이벤트였고 RowDataBound DataList 및 Repeater의 경우 이벤트임ItemDataBound). 해당 이벤트 처리기에서 바인딩된 데이터를 검사하고 포맷 결정을 내릴 수 있습니다. 데이터 기반 사용자 지정 서식 자습서에서 이 기술을 검토했습니다.
  • DetailsView 또는 GridView 컨트롤의 TemplateFields 또는 FormView 컨트롤의 템플릿을 사용하는 경우 템플릿의 서식 함수를 ASP.NET 페이지의 코드 숨김 클래스, 비즈니스 논리 계층 또는 웹 애플리케이션에서 액세스할 수 있는 다른 클래스 라이브러리에 서식 함수를 추가할 수 있습니다. 이 서식 함수는 임의 수의 입력 매개 변수를 수락할 수 있지만 템플릿에서 렌더링하려면 HTML을 반환해야 합니다. 서식 함수는 GridView 컨트롤 자습서의 TemplateFields 사용 자습서에서 먼저 검사되었습니다.

이러한 서식 지정 기술은 모두 DataList 및 Repeater 컨트롤에서 사용할 수 있습니다. 이 자습서에서는 두 컨트롤에 대해 두 가지 기술을 모두 사용하는 예제를 단계별로 살펴보겠습니다.

ItemDataBound이벤트 처리기 사용

데이터가 데이터 원본 컨트롤에서 또는 프로그래밍 방식으로 컨트롤의 DataSource 속성에 데이터를 할당하고 해당 DataBind() 메서드를 호출하여 DataList에 바인딩되면 DataList의 DataBinding 이벤트가 실행되고, 데이터 원본이 열거되고, 각 데이터 레코드가 DataList에 바인딩됩니다. 데이터 원본의 각 레코드에 대해 DataList는 현재 레코드에 DataListItem 바인딩된 개체를 만듭니다. 이 프로세스 중에 DataList는 두 개의 이벤트를 발생합니다.

  • ItemCreatedDataListItem 생성된 후 발생합니다.
  • ItemDataBound 현재 레코드가 에 바인딩된 후에 발생합니다. DataListItem

다음 단계에서는 DataList 컨트롤에 대한 데이터 바인딩 프로세스를 간략하게 설명합니다.

  1. DataListDataBinding 이벤트가 발생합니다.

  2. 데이터는 DataList에 바인딩됩니다.

    데이터 원본의 각 레코드에 대해

    1. DataListItem 개체 만들기
    2. ItemCreated 이벤트 발생
    3. 레코드를 에 바인딩 DataListItem
    4. ItemDataBound 이벤트 발생
    5. 컬렉션에 DataListItem 을 추가합니다.Items

데이터를 Repeater 컨트롤에 바인딩할 때 정확히 동일한 단계 시퀀스를 진행합니다. 유일한 차이점은 인스턴스를 만드는 대신 DataListItem 반복기가 s를 사용 RepeaterItem한다는 것입니다.

참고

Astute 판독기는 DataList 및 Repeater가 데이터에 바인딩된 경우와 GridView가 데이터에 바인딩된 경우를 나타내는 단계 시퀀스 사이에 약간의 변칙을 발견했을 수 있습니다. 데이터 바인딩 프로세스의 꼬리 끝에서 GridView는 이벤트를 발생합니다 DataBound . 그러나 DataList 또는 Repeater 컨트롤에는 이러한 이벤트가 없습니다. 이전 및 사후 수준 이벤트 처리기 패턴이 일반화되기 전에 DataList 및 Repeater 컨트롤이 ASP.NET 1.x 시간 프레임에서 다시 만들어졌기 때문입니다.

GridView와 마찬가지로 데이터에 따라 서식을 지정하는 한 가지 옵션은 이벤트에 대한 ItemDataBound 이벤트 처리기를 만드는 것입니다. 이 이벤트 처리기는 또는 RepeaterItem 에 바인딩 DataListItem 된 데이터를 검사하고 필요에 따라 컨트롤의 서식에 영향을 미칩니다.

DataList 컨트롤의 경우 표준 FontForeColor, , BackColor, CssClass등을 포함하는 스타일 관련 속성을 사용하여 DataListItem 전체 항목에 대한 서식 변경 내용을 구현할 수 있습니다. DataList 템플릿 내에서 특정 웹 컨트롤의 서식에 영향을 주려면 프로그래밍 방식으로 해당 웹 컨트롤의 스타일에 액세스하고 수정해야 합니다. 데이터 기반 사용자 지정 서식 자습서에서 이 작업을 다시 수행하는 방법을 알아보았습니다. Repeater 컨트롤 RepeaterItem 과 마찬가지로 클래스에는 스타일 관련 속성이 없으므로 이벤트 처리기에서 ItemDataBound 에 대한 RepeaterItem 모든 스타일 관련 변경은 템플릿 내에서 웹 컨트롤에 프로그래밍 방식으로 액세스하고 업데이트하여 수행해야 합니다.

ItemDataBound DataList 및 Repeater에 대한 서식 지정 기술은 거의 동일하므로 이 예제에서는 DataList 사용에 중점을 집니다.

1단계: DataList에 제품 정보 표시

서식에 대해 걱정하기 전에 먼저 DataList를 사용하여 제품 정보를 표시하는 페이지를 만들어 보겠습니다. 이전 자습서에서는 각 제품의 이름, 범주, 공급자, 단위당 수량 및 가격을 표시하는 DataList ItemTemplate 를 만들었습니다. 이 자습서에서 이 기능을 반복해 보겠습니다. 이를 위해 DataList 및 해당 ObjectDataSource를 처음부터 다시 만들거나 이전 자습서()에서 만든 페이지에서 해당 컨트롤을 복사하여 이 자습서(Basics.aspxFormatting.aspx)의 페이지에 붙여넣을 수 있습니다.

DataList 및 ObjectDataSource 기능을 에서 Basics.aspxFormatting.aspx복제한 후 잠시 시간을 내어 DataList의 ID 속성을 에서 DataList1 보다 설명적인 ItemDataBoundFormattingExample로 변경합니다. 다음으로, 브라우저에서 DataList를 봅니다. 그림 1에서 보여 주는 것처럼 각 제품 간의 유일한 서식 차이는 배경색이 대체된다는 것입니다.

제품이 DataList 컨트롤에 나열됩니다.

그림 1: 제품이 DataList 컨트롤에 나열됩니다(전체 크기 이미지를 보려면 클릭).

이 자습서에서는 가격이 $20.00 미만인 제품이 이름과 단가가 모두 노란색으로 강조 표시되도록 DataList의 형식을 지정해 보겠습니다.

2단계: ItemDataBound 이벤트 처리기에서 프로그래밍 방식으로 데이터 값 결정

가격이 $20.00 미만인 제품만 사용자 지정 서식을 적용하므로 각 제품의 가격을 확인할 수 있어야 합니다. DataList에 데이터를 바인딩할 때 DataList는 해당 데이터 원본의 레코드를 열거하고 각 레코드에 대해 데이터 원본 레코드DataListItem를 에 바인딩하는 instance 만듭니다 DataListItem . 특정 레코드의 데이터가 현재 DataListItem 개체에 바인딩된 후 DataList 이벤트가 ItemDataBound 발생합니다. 이 이벤트에 대한 이벤트 처리기를 만들어 현재 DataListItem 데이터 값을 검사하고 해당 값에 따라 필요한 서식을 변경할 수 있습니다.

ItemDataBound DataList에 대한 이벤트를 만들고 다음 코드를 추가합니다.

protected void ItemDataBoundFormattingExample_ItemDataBound
    (object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        // Programmatically reference the ProductsRow instance bound
        // to this DataListItem
        Northwind.ProductsRow product =
            (Northwind.ProductsRow)((System.Data.DataRowView)e.Item.DataItem).Row;
        // See if the UnitPrice is not NULL and less than $20.00
        if (!product.IsUnitPriceNull() && product.UnitPrice < 20)
        {
            // TODO: Highlight the product's name and price
        }
    }
}

DataList ItemDataBound 이벤트 처리기의 개념 및 의미 체계는 데이터 기반 사용자 지정 서식 자습서의 RowDataBound GridView 이벤트 처리기에서 사용하는 것과 동일하지만 구문은 약간 다릅니다. ItemDataBound 이벤트가 발생하면 DataListItem 데이터에 바인딩된 이 GridView의 RowDataBound 이벤트 처리기와 마찬가지로 대신 를 e.Row통해 e.Item 해당 이벤트 처리기로 전달됩니다. DataList의 ItemDataBound 이벤트 처리기는 머리글 행, 바닥글 행 및 구분 기호 행을 포함하여 DataList에 추가된 행에 대해 발생합니다. 그러나 제품 정보는 데이터 행에만 바인딩됩니다. 따라서 이벤트를 사용하여 ItemDataBound DataList에 바인딩된 데이터를 검사할 때 먼저 데이터 항목으로 작업하는지 확인해야 합니다. 이 작업은 다음 8개 값 중 하나를 가질 수 있는 의 ItemType 속성을 확인하여 DataListItem 수행할 수 있습니다.

  • AlternatingItem
  • EditItem
  • Footer
  • Header
  • Item
  • Pager
  • SelectedItem
  • Separator

ItemAlternatingItem``DataListItem 는 모두 DataList의 데이터 항목을 구성합니다. 또는 AlternatingItemItem 작업한다고 가정하면 현재 DataListItem에 바인딩된 실제 ProductsRow instance 액세스합니다. s DataItem 속성에는 DataListItem 실제 개체에 대한 참조를 DataRowView 제공하는 개체 Row 에 대한 참조가 ProductsRow 포함됩니다.

다음으로, instance ProductsRow 속성을 검사UnitPrice. Products 테이블의 UnitPrice 필드는 값을 허용 NULL 하므로 속성에 액세스 UnitPrice 하기 전에 먼저 메서드를 사용하여 IsUnitPriceNull() 값이 NULL 있는지 확인하기 위해 검사 합니다. 값이 이 UnitPrice 아닌 NULL경우 $20.00 미만인지 확인하기 위해 검사. 실제로 $20.00 미만인 경우 사용자 지정 서식을 적용해야 합니다.

3단계: 제품 이름 및 가격 강조 표시

제품 가격이 $20.00 미만이라는 것을 알게 되면 이름과 가격을 강조 표시하기만 하면됩니다. 이렇게 하려면 먼저 제품 이름과 가격을 표시하는 의 ItemTemplate 레이블 컨트롤을 프로그래밍 방식으로 참조해야 합니다. 다음으로 노란색 배경을 표시해야 합니다. 이 서식 지정 정보는 Labels BackColor 속성()LabelID.BackColor = Color.Yellow을 직접 수정하여 적용할 수 있습니다. 그러나 이상적으로는 모든 표시 관련 문제를 계단식 스타일시트를 통해 표현해야 합니다. 실제로 데이터 기반 사용자 지정 서식 자습서에서 Styles.css - AffordablePriceEmphasis만들고 설명한 에 정의된 원하는 서식을 제공하는 스타일시트가 이미 있습니다.

서식을 적용하려면 다음 코드와 같이 두 레이블 웹 컨트롤 CssClass 속성을 로 설정하기 AffordablePriceEmphasis만 하면 됩니다.

// Highlight the product name and unit price Labels
// First, get a reference to the two Label Web controls
Label ProductNameLabel = (Label)e.Item.FindControl("ProductNameLabel");
Label UnitPriceLabel = (Label)e.Item.FindControl("UnitPriceLabel");
// Next, set their CssClass properties
if (ProductNameLabel != null)
    ProductNameLabel.CssClass = "AffordablePriceEmphasis";
if (UnitPriceLabel != null)
    UnitPriceLabel.CssClass = "AffordablePriceEmphasis";

ItemDataBound 이벤트 처리기가 완료되면 브라우저에서 Formatting.aspx 페이지를 다시 방문합니다. 그림 2에서 알 수 있듯이 가격이 $20.00 미만인 제품에는 이름과 가격이 모두 강조 표시됩니다.

$20.00 미만의 제품이 강조 표시됨

그림 2: $20.00 미만의 제품이 강조 표시됨(전체 크기 이미지를 보려면 클릭)

참고

DataList는 HTML <table>로 렌더링되므로 해당 DataListItem 인스턴스에는 전체 항목에 특정 스타일을 적용하도록 설정할 수 있는 스타일 관련 속성이 있습니다. 예를 들어 가격이 $20.00 미만일 때 전체 항목을 노란색으로 강조 표시하려는 경우 Labels를 참조하는 코드를 바꾸고 해당 CssClass 속성을 다음 코드 e.Item.CssClass = "AffordablePriceEmphasis" 줄로 설정했을 수 있습니다(그림 3 참조).

RepeaterItem 그러나 반복기 컨트롤을 구성하는 는 이러한 스타일 수준 속성을 제공하지 않습니다. 따라서 반복자에 사용자 지정 서식을 적용하려면 그림 2에서와 같이 반복기 템플릿 내의 웹 컨트롤에 스타일 속성을 적용해야 합니다.

전체 제품 항목은 $20.00 미만의 제품에 대해 강조 표시됨

그림 3: 전체 제품 항목이 $20.00 미만의 제품에 대해 강조 표시됨(전체 크기 이미지를 보려면 클릭)

템플릿 내에서 서식 함수 사용

GridView 컨트롤의 TemplateFields 사용 자습서에서는 GridView TemplateField 내에서 서식 함수를 사용하여 GridView 행에 바인딩된 데이터에 따라 사용자 지정 서식을 적용하는 방법을 알아보았습니다. 서식 함수는 템플릿에서 호출할 수 있는 메서드이며 해당 위치에서 내보낼 HTML을 반환합니다. 형식 지정 함수는 ASP.NET 페이지의 코드 숨김 클래스에 상주하거나 폴더 또는 별도의 클래스 라이브러리 프로젝트의 클래스 파일 App_Code 로 중앙 집중화할 수 있습니다. 여러 ASP.NET 페이지 또는 다른 ASP.NET 웹 애플리케이션에서 동일한 서식 함수를 사용하려는 경우 서식 함수를 ASP.NET 페이지의 코드 숨김 클래스에서 이동하는 것이 좋습니다.

서식 함수를 보여 주기 위해 제품 정보가 제품 이름 옆에 있는 [DISCONTINUED] 텍스트(중단된 경우)를 포함하도록 하겠습니다. 또한 이벤트 처리기 예제에서 ItemDataBound 와 같이 $20.00 미만인 경우 가격이 노란색으로 강조 표시되도록 하겠습니다. 가격이 $20.00 이상인 경우 실제 가격을 표시하지 말고 대신 텍스트인 가격 견적을 요청하세요. 그림 4는 이러한 서식 규칙이 적용된 제품 목록의 스크린샷을 보여 줍니다.

DataList 컨트롤에 나열된 제품을 보여 주는 스크린샷. 20.00달러 이상의 비용이 드는 제품의 가격이 '가격 견적을 요청하세요.' 텍스트로 대체되었습니다.

그림 4: 고가의 제품의 경우 가격이 텍스트로 바뀝니다. 가격 견적을 요청하세요(전체 크기 이미지를 보려면 클릭).

1단계: 서식 함수 만들기

이 예제에서는 필요한 경우 [DISCONTINUED] 텍스트와 함께 제품 이름을 표시하는 형식 지정 함수와 $20.00 미만인 경우 강조 표시된 가격을 표시하는 함수 또는 그렇지 않으면 가격 견적을 호출하세요. ASP.NET 페이지의 코드 숨김 클래스에서 이러한 함수를 만들고 이름을 및 DisplayPrice로 지정 DisplayProductNameAndDiscontinuedStatus 해 보겠습니다. 두 메서드 모두 HTML을 반환하여 문자열로 렌더링해야 하며 ASP.NET 페이지의 선언적 구문 부분에서 호출하려면 둘 다 표시 Protected (또는 Public)해야 합니다. 다음 두 메서드에 대한 코드는 다음과 같습니다.

protected string DisplayProductNameAndDiscontinuedStatus
    (string productName, bool discontinued)
{
    // Return just the productName if discontinued is false
    if (!discontinued)
        return productName;
    else
        // otherwise, return the productName appended with the text "[DISCONTINUED]"
        return string.Concat(productName, " [DISCONTINUED]");
}
protected string DisplayPrice(Northwind.ProductsRow product)
{
    // If price is less than $20.00, return the price, highlighted
    if (!product.IsUnitPriceNull() && product.UnitPrice < 20)
        return string.Concat("<span class=\"AffordablePriceEmphasis\">",
                              product.UnitPrice.ToString("C"), "</span>");
    else
        // Otherwise return the text, "Please call for a price quote"
        return "<span>Please call for a price quote</span>";
}

메서드는 DisplayProductNameAndDiscontinuedStatus 및 데이터 필드의 productName 값을 스칼라 값으로 허용하는 반면 DisplayPrice 메서드는 스칼라 값이 아닌 unitPrice instance 허용합니다 ProductsRowdiscontinued. 두 방법 중 하나가 작동합니다. 그러나 형식 지정 함수가 데이터베이스 NULL 값을 포함할 수 있는 스칼라 값(예: ; ProductNameDiscontinued 또는 허용 NULL 값)으로 UnitPrice작업하는 경우 이러한 스칼라 입력을 처리하는 데 특별히 주의해야 합니다.

특히 들어오는 값이 예상 데이터 형식이 아닌 instance 될 DBNull 수 있으므로 입력 매개 변수는 형식 Object 이어야 합니다. 또한 들어오는 값이 데이터베이스 NULL 값인지 여부를 확인하려면 검사 수행해야 합니다. 즉, 메서드가 DisplayPrice 가격을 스칼라 값으로 허용하려면 다음 코드를 사용해야 합니다.

protected string DisplayPrice(object unitPrice)
{
    // If price is less than $20.00, return the price, highlighted
    if (!Convert.IsDBNull(unitPrice) && ((decimal) unitPrice) < 20)
        return string.Concat("<span class=\"AffordablePriceEmphasis\">",
                              ((decimal) unitPrice).ToString("C"), "</span>");
    else
        // Otherwise return the text, "Please call for a price quote"
        return "<span>Please call for a price quote</span>";
}

unitPrice 입력 매개 변수는 형식 Object 이며 가 인지 여부를 확인하기 unitPrice 위해 조건문이 DBNull 수정되었습니다. 또한 입력 매개 변수가 unitPriceObject전달되므로 10진수 값으로 캐스팅되어야 합니다.

2단계: DataList의 ItemTemplate에서 서식 함수 호출

ASP.NET 페이지의 코드 숨김 클래스에 서식 함수를 추가하면 DataList의 ItemTemplate에서 이러한 서식 함수를 호출하기만 하면 됩니다. 템플릿에서 서식 함수를 호출하려면 databinding 구문 내에 함수 호출을 배치합니다.

<%# MethodName(inputParameter1, inputParameter2, ...) %>

DataList의 ItemTemplateProductNameLabel 레이블 웹 컨트롤은 현재 속성 Text 에 의 결과를 <%# Eval("ProductName") %>할당하여 제품 이름을 표시합니다. 이름 및 텍스트 [DISCONTINUED]를 표시하려면 필요한 경우 선언적 구문을 업데이트하여 속성에 메서드 값을 DisplayProductNameAndDiscontinuedStatus 할당 Text 합니다. 이렇게 할 때 구문을 사용하여 Eval("columnName") 제품 이름과 중단된 값을 전달해야 합니다. Eval는 형식Object의 값을 반환하지만 메서드는 DisplayProductNameAndDiscontinuedStatusBoolean형식 String 의 입력 매개 변수를 예상하므로 메서드에서 반환하는 Eval 값을 다음과 같이 예상된 입력 매개 변수 형식으로 캐스팅해야 합니다.

<h4>
    <asp:Label ID="ProductNameLabel" runat="server"
        Text='<%# DisplayProductNameAndDiscontinuedStatus((string) Eval("ProductName"),
              (bool) Eval("Discontinued")) %>'>
    </asp:Label>
</h4>

가격을 표시하기 위해 제품 이름 및 [DISCONTINUED] 텍스트를 표시하기 위해 수행한 것처럼 Label 속성을 Text 메서드에서 반환 DisplayPrice 된 값으로 설정할 UnitPriceLabel 수 있습니다. 그러나 를 스칼라 입력 매개 변수로 전달하는 UnitPrice 대신 전체 ProductsRow instance 전달합니다.

<asp:Label ID="UnitPriceLabel" runat="server"
    Text='<%# DisplayPrice((Northwind.ProductsRow)
          ((System.Data.DataRowView) Container.DataItem).Row) %>'>
</asp:Label>

서식 함수를 호출한 후 잠시 시간을 내어 브라우저에서 진행 상황을 확인합니다. 화면은 그림 5와 유사해야 합니다. 텍스트 [DISCONTINUED]를 포함한 중단된 제품과 가격이 $20.00 이상인 해당 제품이 텍스트로 대체된 경우 가격 견적을 요청하세요.

DataList 컨트롤에 나열된 제품을 보여 주는 스크린샷. 20.00달러 이상의 비용이 드는 제품의 가격이 '가격 견적을 요청하세요'라는 텍스트와 중단된 제품의 이름에 '[DISCONTINUED]' 텍스트가 추가되었습니다.

그림 5: 고가의 제품의 경우 가격이 텍스트로 바뀝니다. 가격 견적을 요청하세요(전체 크기 이미지를 보려면 클릭).

요약

데이터를 기반으로 DataList 또는 Repeater 컨트롤의 내용 서식 지정은 두 가지 기술을 사용하여 수행할 수 있습니다. 첫 번째 기술은 데이터 원본의 ItemDataBound 각 레코드가 새 DataListItem 또는 RepeaterItem에 바인딩되면 발생하는 이벤트에 대한 이벤트 처리기를 만드는 것입니다. ItemDataBound 이벤트 처리기에서 현재 항목의 데이터를 검사한 다음 서식을 템플릿의 내용에 적용하거나 전체 항목 자체에 DataListItem 적용할 수 있습니다.

또는 형식 지정 함수를 통해 사용자 지정 서식을 실현할 수 있습니다. 서식 함수는 해당 위치에서 내보내는 HTML을 반환하는 DataList 또는 Repeater 템플릿에서 호출할 수 있는 메서드입니다. 서식 함수에서 반환되는 HTML은 현재 항목에 바인딩되는 값에 따라 결정되는 경우가 많습니다. 이러한 값은 스칼라 값으로 또는 항목에 바인딩되는 전체 개체(예: instance)를 전달하여 서식 함수에 ProductsRow 전달될 수 있습니다.

행복한 프로그래밍!

저자 정보

7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 자신을 가르친다 ASP.NET 2.0 24 시간. 그는 에서 찾을 수있는 그의 블로그를 통해 또는 에 mitchell@4GuysFromRolla.comhttp://ScottOnWriting.NET도달 할 수 있습니다.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 야코프 엘리스, 랜디 슈미트, 리즈 슐록이었습니다. 예정된 MSDN 문서를 검토하시겠습니까? 그렇다면 에 줄을 놓습니다 mitchell@4GuysFromRolla.com.