DetailsView 컨트롤에서 TemplateFields 사용(VB)Using TemplateFields in the DetailsView Control (VB)

Scott Mitchellby Scott Mitchell

샘플 앱 다운로드 또는 PDF 다운로드Download Sample App or Download PDF

GridView에서 사용할 수 있는 것과 동일한 템플릿 필드 기능을 DetailsView 컨트롤과 함께 사용할 수도 있습니다.The same TemplateFields capabilities available with the GridView are also available with the DetailsView control. 이 자습서에서는 서식 필드를 포함 하는 DetailsView을 사용 하 여 한 번에 하나의 제품을 표시 합니다.In this tutorial we'll display one product at a time using a DetailsView containing TemplateFields.

소개Introduction

Templatefield로 변환는 BoundField, CheckBoxField, hyperlink 필드 및 기타 데이터 필드 컨트롤 보다 데이터를 렌더링할 때 더 높은 수준의 유연성을 제공 합니다.The TemplateField offers a higher degree of flexibility in rendering data than the BoundField, CheckBoxField, HyperLinkField, and other data field controls. 이전 자습서 에서는 GridView에서 templatefield로 변환를 사용 하 여 다음을 수행 하는 방법을 살펴보았습니다.In the previous tutorial we looked at using the TemplateField in a GridView to:

  • 한 열에 여러 데이터 필드 값을 표시 합니다.Display multiple data field values in one column. 특히 FirstNameLastName 필드가 하나의 GridView 열로 결합 되었습니다.Specifically, both the FirstName and LastName fields were combined into one GridView column.
  • 대체 웹 컨트롤을 사용 하 여 데이터 필드 값을 표현 합니다.Use an alternate Web control to express a data field value. 달력 컨트롤을 사용 하 여 HiredDate 값을 표시 하는 방법을 살펴보았습니다.We saw how to show the HiredDate value using a Calendar control.
  • 기본 데이터를 기반으로 상태 정보를 표시 합니다.Show status information based on the underlying data. Employees 테이블에는 직원이 작업에서 있었던 일 수를 반환 하는 열이 포함 되어 있지 않지만 Templatefield로 변환 및 형식 지정 방법을 사용 하 여 이전 자습서의 GridView 예제에서 이러한 정보를 표시할 수 있습니다.While the Employees table does not contain a column that returns the number of days an employee has been on the job, we were able to display such information in the GridView example in the previous tutorial with the use of a TemplateField and formatting method.

GridView에서 사용할 수 있는 것과 동일한 템플릿 필드 기능을 DetailsView 컨트롤과 함께 사용할 수도 있습니다.The same TemplateFields capabilities available with the GridView are also available with the DetailsView control. 이 자습서에서는 두 개의 템플릿 필드가 포함 된 DetailsView을 사용 하 여 한 번에 하나의 제품을 표시 합니다.In this tutorial we'll display one product at a time using a DetailsView that contains two TemplateFields. 첫 번째 Templatefield로 변환는 UnitPrice, UnitsInStockUnitsOnOrder 데이터 필드를 하나의 DetailsView 행으로 결합 합니다.The first TemplateField will combine the UnitPrice, UnitsInStock, and UnitsOnOrder data fields into one DetailsView row. 두 번째 Templatefield로 변환는 Discontinued 필드의 값을 표시 하지만 Discontinued True경우 "YES"를 표시 하는 형식 지정 메서드를 사용 하 고 그렇지 않으면 "아니요"를 표시 합니다.The second TemplateField will display the value of the Discontinued field, but will use a formatting method to display "YES" if Discontinued is True, and "NO" otherwise.

두 개의 템플릿 필드를 사용 하 여 표시를 사용자 지정 합니다.Two TemplateFields are Used to Customize the Display

그림 1: 표시를 사용자 지정 하는 데 사용 되는 두 개의 템플릿 필드 (전체 크기 이미지를 보려면 클릭)Figure 1: Two TemplateFields are Used to Customize the Display (Click to view full-size image)

이제 시작하겠습니다.Let's get started!

1 단계: DetailsView에 데이터 바인딩Step 1: Binding the Data to the DetailsView

이전 자습서에 설명 된 것 처럼 템플릿 필드를 사용 하 여 작업 하는 경우에는 단순히 BoundFields를 포함 하는 DetailsView 컨트롤을 만든 다음 새 템플릿 필드를 추가 하거나 필요에 따라 기존 BoundFields를 템플릿 필드로 변환 하 여 시작 하는 것이 가장 쉬운 경우가 많습니다. .As discussed in the previous tutorial, when working with TemplateFields it's often easiest to start by creating the DetailsView control that contains just BoundFields and then add new TemplateFields or convert the existing BoundFields to TemplateFields as needed. 따라서 디자이너를 통해 페이지에 DetailsView을 추가 하 고 제품 목록을 반환 하는 ObjectDataSource에 바인딩하여이 자습서를 시작 합니다.Therefore, start this tutorial by adding a DetailsView to the page through the Designer and binding it to an ObjectDataSource that returns the list of products. 이러한 단계에서는 각 제품의 부울이 아닌 값 필드와 하나의 부울 값 필드 (단종 되지 않음)에 대해 BoundFields를 사용 하 여 DetailsView을 만듭니다.These steps will create a DetailsView with BoundFields for each of the product's non-Boolean value fields and a CheckBoxField for the one Boolean value field (Discontinued).

DetailsViewTemplateField.aspx 페이지를 열고 DetailsView를 도구 상자에서 디자이너로 끌어 옵니다.Open the DetailsViewTemplateField.aspx page and drag a DetailsView from the Toolbox onto the Designer. DetailsView의 스마트 태그에서 ProductsBLL 클래스의 GetProducts() 메서드를 호출 하는 새 ObjectDataSource 컨트롤을 추가 하도록 선택 합니다.From the DetailsView's smart tag choose to add a new ObjectDataSource control that invokes the ProductsBLL class's GetProducts() method.

GetProducts () 메서드를 호출 하는 새 ObjectDataSource 컨트롤을 추가 Add a New ObjectDataSource Control that Invokes the GetProducts() Method

그림 2: GetProducts() 메서드를 호출 하는 새 ObjectDataSource 컨트롤 추가 (전체 크기 이미지를 보려면 클릭)Figure 2: Add a New ObjectDataSource Control that Invokes the GetProducts() Method (Click to view full-size image)

이 보고서의 경우 ProductID, SupplierID, CategoryIDReorderLevel BoundFields를 제거 합니다.For this report remove the ProductID, SupplierID, CategoryID, and ReorderLevel BoundFields. 그런 다음 CategoryNameSupplierName BoundFields이 ProductName BoundField 바로 뒤에 나타나도록 BoundFields을 다시 정렬 합니다.Next, reorder the BoundFields so that the CategoryName and SupplierName BoundFields appear immediately after the ProductName BoundField. BoundFields에 대 한 속성 및 서식 속성을 적절 하 게 조정 하 HeaderText는 것은 마음에.Feel free to adjust the HeaderText properties and formatting properties for the BoundFields as you see fit. GridView와 마찬가지로 이러한 BoundField 편집은 필드 대화 상자 (DetailsView의 스마트 태그에서 필드 편집 링크를 클릭 하 여 액세스 가능) 또는 선언적 구문을 통해 수행할 수 있습니다.Like with the GridView, these BoundField-level edits can be performed through the Fields dialog box (accessible by clicking on the Edit Fields link in the DetailsView's smart tag) or through the declarative syntax. 마지막으로 DetailsView 컨트롤이 표시 된 데이터에 따라 확장 될 수 있도록 하 고, 스마트 태그에서 페이징 사용 확인란을 선택 하 여 detailsview의 Height을 지우고 속성 값을 Width 합니다.Lastly, clear out the DetailsView's Height and Width property values in order to allow the DetailsView control to expand based on the data displayed and check the Enable Paging checkbox in the smart tag.

이러한 변경을 수행한 후에는 DetailsView 컨트롤의 선언적 태그가 다음과 같이 표시 됩니다.After making these changes, your DetailsView control's declarative markup should look similar to the following:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"
    EnableViewState="False">
    <Fields>
        <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="QuantityPerUnit"
          HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
          SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
          HeaderText="Units In Stock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
          HeaderText="Units On Order" SortExpression="UnitsOnOrder" />
        <asp:CheckBoxField DataField="Discontinued"
          HeaderText="Discontinued" SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>

잠시 시간을 사용 하 여 브라우저를 통해 페이지를 봅니다.Take a moment to view the page through a browser. 이 시점에서 제품의 이름, 범주, 공급자, 가격, 재고 단위, 주문 단위 및 단종 됨 상태를 표시 하는 행이 나열 된 단일 제품 (Chai)이 표시 됩니다.At this point you should see a single product listed (Chai) with rows showing the product's name, category, supplier, price, units in stock, units on order, and its discontinued status.

일련의 BoundFields을 사용 하 여 제품의 세부 정보를 표시 합니다.The Product's Details Are Shown Using a Series of BoundFields

그림 3: 제품의 세부 정보는 일련의 BoundFields를 사용 하 여 표시 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 3: The Product's Details Are Shown Using a Series of BoundFields (Click to view full-size image)

2 단계: 가격, 재고 단위 및 주문에 대 한 단위를 한 행으로 결합Step 2: Combining the Price, Units In Stock, and Units On Order Into One Row

DetailsView에는 UnitPrice, UnitsInStockUnitsOnOrder 필드에 대 한 행이 있습니다.The DetailsView has a row for the UnitPrice, UnitsInStock, and UnitsOnOrder fields. 새 Templatefield로 변환를 추가 하거나 기존 UnitPrice, UnitsInStockUnitsOnOrder BoundFields 중 하나를 Templatefield로 변환로 변환 하 여 이러한 데이터 필드를 단일 행으로 결합할 수 있습니다.We can combine these data fields into a single row with a TemplateField either by adding a new TemplateField or by converting one of the existing UnitPrice, UnitsInStock, and UnitsOnOrder BoundFields into a TemplateField. 기존 BoundFields 변환을 개인적으로 선호 하는 반면 새 Templatefield로 변환를 추가 하 여 연습 하겠습니다.While I personally prefer converting existing BoundFields, let's practice by adding a new TemplateField.

DetailsView의 스마트 태그에서 필드 편집 링크를 클릭 하 여 필드 대화 상자를 표시 하는 것부터 시작 합니다.Start by clicking on the Edit Fields link in the DetailsView's smart tag to bring up the Fields dialog box. 그런 다음 새 Templatefield로 변환를 추가 하 고 해당 HeaderText 속성을 "Price and Inventory"로 설정 하 고 UnitPrice BoundField 위에 배치 되도록 새 Templatefield로 변환를 이동 합니다.Next, add a new TemplateField and set its HeaderText property to "Price and Inventory" and move the new TemplateField so that it is positioned above the UnitPrice BoundField.

새 Templatefield로 변환를 DetailsView 컨트롤에 추가 합니다.Add a New TemplateField to the DetailsView Control

그림 4: DetailsView 컨트롤에 새 templatefield로 변환 추가 (전체 크기 이미지를 보려면 클릭)Figure 4: Add a New TemplateField to the DetailsView Control (Click to view full-size image)

이 새 Templatefield로 변환에는 UnitPrice, UnitsInStockUnitsOnOrder에 현재 표시 된 값이 포함 되므로 제거 하겠습니다.Since this new TemplateField will contain the values currently displayed in the UnitPrice, UnitsInStock, and UnitsOnOrder BoundFields, let's remove them.

이 단계의 마지막 작업은 Price 및 Inventory Templatefield로 변환에 대 한 ItemTemplate 태그를 정의 하는 것입니다 .이 작업은 디자이너에서 DetailsView의 템플릿 편집 인터페이스를 통하거나 컨트롤의 선언적 구문을 통해 수행할 수 있습니다.The last task for this step is to define the ItemTemplate markup for the Price and Inventory TemplateField, which can be accomplished either through the DetailsView's template editing interface in the Designer or by hand through the control's declarative syntax. GridView와 마찬가지로, 스마트 태그의 템플릿 편집 링크를 클릭 하 여 DetailsView의 템플릿 편집 인터페이스에 액세스할 수 있습니다.As with the GridView, the DetailsView's template editing interface can be accessed by clicking on the Edit Templates link in the smart tag. 여기에서 드롭다운 목록에서 편집할 템플릿을 선택 하 고 도구 상자에서 웹 컨트롤을 추가할 수 있습니다.From here you can select the template to edit from the drop-down list and then add any Web controls from the Toolbox.

이 자습서의 경우 Price 및 Inventory Templatefield로 변환의 ItemTemplate에 레이블 컨트롤을 추가 하 여 시작 합니다.For this tutorial, start by adding a Label control to the Price and Inventory TemplateField's ItemTemplate. 그런 다음 Label 웹 컨트롤의 스마트 태그에서 데이터 바인딩 편집 링크를 클릭 하 고 Text 속성을 UnitPrice 필드에 바인딩합니다.Next, click on the Edit DataBindings link from the Label Web control's smart tag and bind the Text property to the UnitPrice field.

레이블의 Text 속성을 UnitPrice 데이터 필드에 바인딩합니다.Bind the Label's Text Property to the UnitPrice Data Field

그림 5: 레이블의 Text 속성을 UnitPrice 데이터 필드에 바인딩 (전체 크기 이미지를 보려면 클릭)Figure 5: Bind the Label's Text Property to the UnitPrice Data Field (Click to view full-size image)

통화로 가격 서식 지정Formatting the Price as a Currency

이 외에도 Label Web control Price 및 Inventory Templatefield로 변환는 이제 선택한 제품의 가격만 표시 합니다.With this addition, the Label Web control Price and Inventory TemplateField will now display just the price for the selected product. 그림 6에서는 브라우저를 통해 볼 때의 진행 상황을 보여 줍니다.Figure 6 shows a screen shot of our progress thus far when viewed through a browser.

가격 및 재고 Templatefield로 변환 가격을 표시 하는 The Price and Inventory TemplateField Shows the Price

그림 6: 가격 및 재고 templatefield로 변환 가격 (전체 이미지를 보려면 클릭)을 표시 합니다.Figure 6: The Price and Inventory TemplateField Shows the Price (Click to view full-size image)

제품의 가격은 통화 형식으로 지정 되지 않습니다.Note that the product's price is not formatted as a currency. BoundField를 사용 하면 HtmlEncode 속성을 False로 설정 하 고 DataFormatString 속성을 {0:formatSpecifier}로 설정 하 여 형식을 지정할 수 있습니다.With a BoundField, formatting is possible by setting the HtmlEncode property to False and the DataFormatString property to {0:formatSpecifier}. 그러나 Templatefield로 변환의 경우에는 데이터 바인딩 구문이 나 응용 프로그램 코드 내에 정의 된 서식 지정 메서드 (예: ASP.NET 페이지의 코드 숨김이 클래스)를 사용 하 여 서식 지정 명령을 지정 해야 합니다.For a TemplateField, however, any formatting instructions must be specified in the databinding syntax or through the use of a formatting method defined somewhere within the application's code (such as in the ASP.NET page's code-behind class).

Label 웹 컨트롤에서 사용 되는 데이터 바인딩 구문의 서식을 지정 하려면 레이블의 스마트 태그에서 데이터 바인딩 편집 링크를 클릭 하 여 데이터 바인딩 대화 상자로 돌아갑니다.To specify the formatting for the databinding syntax used in the Label Web control, return to the DataBindings dialog box by clicking on the Edit DataBindings link from the Label's smart tag. 서식 드롭다운 목록에서 직접 서식 지정 지침을 입력 하거나 정의 된 서식 문자열 중 하나를 선택할 수 있습니다.You can type the formatting instructions directly in the Format drop-down list or select one of the defined format strings. BoundField의 DataFormatString 속성과 마찬가지로 {0:formatSpecifier}를 사용 하 여 서식을 지정 합니다.Like with the BoundField's DataFormatString property, the formatting is specified using {0:formatSpecifier}.

UnitPrice 필드의 경우 적절 한 드롭다운 목록 값을 선택 하거나 직접 {0:C}를 입력 하 여 지정 된 통화 서식을 사용 합니다.For the UnitPrice field use the currency formatting specified either by selecting the appropriate drop-down list value or by typing in {0:C} by hand.

가격을 통화로 서식 지정 Format the Price as a Currency

그림 7: 가격을 통화로 서식 지정 (전체 크기 이미지를 보려면 클릭)Figure 7: Format the Price as a Currency (Click to view full-size image)

선언적으로 서식 지정은 Bind 또는 Eval 메서드에 두 번째 매개 변수로 표시 됩니다.Declaratively, the formatting specification is indicated as a second parameter into the Bind or Eval methods. 디자이너를 통해 설정 된 설정은 선언 태그에 다음 데이터 바인딩 식을 생성 합니다.The settings just made through the Designer result in the following databinding expression in the declarative markup:

<asp:Label ID="Label1" runat="server" Text='<%# Eval("UnitPrice", "{0:C}") %>'/>

Templatefield로 변환에 나머지 데이터 필드 추가Adding the Remaining Data Fields to the TemplateField

이 시점에서 Price 및 Inventory Templatefield로 변환의 UnitPrice 데이터 필드를 표시 하 고 서식을 지정 했지만 UnitsInStockUnitsOnOrder 필드를 표시 해야 합니다.At this point we've displayed and formatted the UnitPrice data field in the Price and Inventory TemplateField, but still need to display the UnitsInStock and UnitsOnOrder fields. 가격 및 괄호 아래 줄에이를 표시 해 보겠습니다.Let's display these on a line below the price and in parentheses. 디자이너의 템플릿 편집 인터페이스에서 템플릿 내에 커서를 놓고 표시 될 텍스트를 입력 하기만 하면 이러한 태그를 추가할 수 있습니다.From the template editing interface in the Designer, such markup can be added by positioning your cursor within the template and simply typing in the text to be displayed. 또는 선언적 구문에서이 태그를 직접 입력할 수 있습니다.Alternatively, this markup can be entered directly in the declarative syntax.

Price 및 Inventory Templatefield로 변환에서 다음과 같이 가격 및 인벤토리 정보를 표시 하도록 정적 태그, 레이블 웹 컨트롤 및 데이터 바인딩 구문을 추가 합니다.Add the static markup, Label Web controls, and databinding syntax so that the Price and Inventory TemplateField displays the price and inventory information like so:

UnitPriceUnitPrice
(재고/주문: UnitsInStock / UnitsOnOrder)(In Stock / On Order: UnitsInStock / UnitsOnOrder)

이 작업을 수행한 후에는 DetailsView의 선언적 태그가 다음과 같이 표시 됩니다.After performing this task your DetailsView's declarative markup should look similar to the following:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"
    EnableViewState="False">
    <Fields>
        <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="QuantityPerUnit"
          HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
        <asp:TemplateField HeaderText="Price and Inventory">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server"
                  Text='<%# Eval("UnitPrice", "{0:C}") %>'></asp:Label>
                <br />
                <strong>
                (In Stock / On Order: </strong>
                <asp:Label ID="Label2" runat="server"
                  Text='<%# Eval("UnitsInStock") %>'></asp:Label>
                <strong>/</strong>
                <asp:Label ID="Label3" runat="server"
                  Text='<%# Eval("UnitsOnOrder") %>'>
                </asp:Label><strong>)</strong>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>

이러한 변경 내용으로 price 및 inventory 정보를 단일 DetailsView 행으로 통합 했습니다.With these changes we've consolidated the price and inventory information into a single DetailsView row.

가격 및 재고 정보가 단일 행에 표시 The Price and Inventory Information is Displayed in a Single Row

그림 8: 가격 및 인벤토리 정보는 단일 행에 표시 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 8: The Price and Inventory Information is Displayed in a Single Row (Click to view full-size image)

3 단계: 단종 된 필드 정보 사용자 지정Step 3: Customizing the Discontinued Field Information

Products 테이블의 Discontinued 열은 제품이 단종 되었는지 여부를 나타내는 비트 값입니다.The Products table's Discontinued column is a bit value that indicates whether the product has been discontinued. DetailsView (또는 GridView)를 데이터 소스 컨트롤에 바인딩할 때 Discontinued와 같은 부울 값 필드는 CheckBoxFields으로 구현 되지만 부울이 아닌 값 필드 (예: ProductID, ProductName등)는 BoundFields로 구현 됩니다.When binding a DetailsView (or GridView) to a data source control, the Boolean value fields, like Discontinued, are implemented as CheckBoxFields whereas non-Boolean value fields, like ProductID, ProductName, and so on, are implemented as BoundFields. CheckBoxField은 데이터 필드의 값이 True 인지 여부를 확인 하 고 그렇지 않으면 선택 취소 된 비활성화 된 확인란으로 렌더링 합니다.The CheckBoxField renders as a disabled checkbox that is checked if the data field's value is True and unchecked otherwise.

CheckBoxField를 표시 하는 대신 제품이 중단 되었는지 여부를 나타내는 텍스트를 표시 하는 것이 좋습니다.Rather than display the CheckBoxField we may want to instead display text indicating whether or not the product is discontinued. 이를 위해 DetailsView에서 CheckBoxField를 제거한 다음 DataField 속성이 Discontinued로 설정 된 BoundField를 추가할 수 있습니다.To accomplish this we could remove the CheckBoxField from the DetailsView and then add a BoundField whose DataField property was set to Discontinued. 잠시 기다려 주십시오.Take a moment to do this. 이 변경 후에는 DetailsView에서 중단 된 제품에 대해 "True" 라는 텍스트를 표시 하 고 아직 활성 상태인 제품에 대해서는 "False"를 표시 합니다.After this change the DetailsView shows the text "True" for discontinued products and "False" for products that are still active.

True 및 False 문자열을 사용 하 여 중단 된 상태를 표시 합니다.The Strings True and False Are Used to Display the Discontinued State

그림 9: 문자열 True 및 False는 중단 된 상태를 표시 하는 데 사용 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 9: The Strings True and False Are Used to Display the Discontinued State (Click to view full-size image)

문자열 "True" 또는 "False"를 사용 하지 않고 대신 "YES" 및 "NO"를 사용 하려고 한다고 가정해 보겠습니다.Imagine that we didn't want the strings "True" or "False" to be used, but "YES" and "NO", instead. 이러한 사용자 지정은 Templatefield로 변환 및 형식 지정 방법을 지원 하 여 수행할 수 있습니다.Such customization can be performed with the aid of a TemplateField and a formatting method. 서식 지정 메서드는 다양 한 입력 매개 변수를 사용할 수 있지만 템플릿에 삽입할 HTML (문자열)을 반환 해야 합니다.A formatting method can take in any number of input parameters, but must return the HTML (as a string) to inject into the template.

Northwind.ProductsRow 개체를 입력 매개 변수로 허용 하 고 문자열을 반환 하는 DisplayDiscontinuedAsYESorNO 라는 DetailsViewTemplateField.aspx 페이지의 코드 숨김이 클래스에 서식 지정 메서드를 추가 합니다.Add a formatting method to the DetailsViewTemplateField.aspx page's code-behind class named DisplayDiscontinuedAsYESorNO that accepts a Northwind.ProductsRow object as an input parameter and returns a string. 이전 자습서에서 설명한 대로이 메서드는 템플릿에서 액세스할 수 있도록 Protected 또는 Public로 표시 되어야 합니다 .As discussed in the previous tutorial, this method must be marked as Protected or Public in order to be accessible from the template.

Protected Function DisplayDiscontinuedAsYESorNO(discontinued As Boolean) As String
    If discontinued Then
        Return "YES"
    Else
        Return "NO"
    End If
End Function

이 메서드는 입력 매개 변수 (discontinued)를 확인 하 고 "YES" (True경우 "NO")를 반환 합니다.This method checks the input parameter (discontinued) and returns "YES" if it is True, "NO" otherwise.

Note

이전 자습서에서 검사 한 서식 지정 메서드에서는 NULL을 포함 하는 데이터 필드를 전달 했으며, 따라서 직원의 HiredDate 속성 값에 EmployeesRowHiredDate 속성에 액세스 하기 전에 데이터베이스 NULL 값이 있는지 확인 해야 합니다.In the formatting method examined in the previous tutorial recall that we were passing in a data field that might contain NULL s and therefore needed to check if the employee's HiredDate property value had a database NULL value before accessing the EmployeesRow's HiredDate property. Discontinued 열에는 데이터베이스 NULL 값이 할당 될 수 없으므로 이러한 검사가 필요 하지 않습니다.Such a check is not needed here since the Discontinued column can never have database NULL values assigned. 또한이로 인해 메서드가 Object형식의 매개 변수 또는 ProductsRow 인스턴스를 수락 하지 않고 부울 입력 매개 변수를 사용할 수 있습니다.Moreover, this is why the method can accept a Boolean input parameter rather than having to accept a ProductsRow instance or a parameter of type Object.

이 형식 지정 메서드를 완료 하면 Templatefield로 변환의 ItemTemplate에서 호출 하는 것만 남았습니다.With this formatting method complete, all that remains is to call it from the TemplateField's ItemTemplate. Templatefield로 변환를 만들려면 BoundField Discontinued 제거 하 고 새 Templatefield로 변환를 추가 하거나 Discontinued BoundField을 Templatefield로 변환로 변환 합니다.To create the TemplateField either remove the Discontinued BoundField and add a new TemplateField or convert the Discontinued BoundField into a TemplateField. 그런 다음 선언적 마크업 뷰에서 DisplayDiscontinuedAsYESorNO 메서드를 호출 하는 ItemTemplate을 포함 하도록 Templatefield로 변환를 편집 하 여 현재 ProductRow 인스턴스의 Discontinued 속성 값을 전달 합니다.Then, from the declarative markup view, edit the TemplateField so that it contains just an ItemTemplate that invokes the DisplayDiscontinuedAsYESorNO method, passing in the value of the current ProductRow instance's Discontinued property. 이는 Eval 메서드를 통해 액세스할 수 있습니다.This can be accessed via the Eval method. 특히 Templatefield로 변환의 태그는 다음과 같습니다.Specifically, the TemplateField's markup should look like:

<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
    <ItemTemplate>
        <%#DisplayDiscontinuedAsYESorNO(Convert.ToBoolean(Eval("Discontinued")))%> 
    </ItemTemplate>
</asp:TemplateField>

이렇게 하면 DetailsView을 렌더링할 때 DisplayDiscontinuedAsYESorNO 메서드를 호출 하 여 ProductRow 인스턴스의 Discontinued 값을 전달 합니다.This will cause the DisplayDiscontinuedAsYESorNO method to be invoked when rendering the DetailsView, passing in the ProductRow instance's Discontinued value. Eval 메서드는 Object형식의 값을 반환 하지만 DisplayDiscontinuedAsYESorNO 메서드에 Boolean형식의 입력 매개 변수가 필요 하기 때문에 Eval 메서드 반환 값을 Boolean로 캐스팅 합니다.Since the Eval method returns a value of type Object, but the DisplayDiscontinuedAsYESorNO method expects an input parameter of type Boolean, we cast the Eval methods return value to Boolean. 그러면 DisplayDiscontinuedAsYESorNO 메서드는 받는 값에 따라 "YES" 또는 "NO"를 반환 합니다.The DisplayDiscontinuedAsYESorNO method will then return "YES" or "NO" depending on the value it receives. 반환 된 값은이 DetailsView 행에 표시 되는 값입니다 (그림 10 참조).The returned value is what is displayed in this DetailsView row (see Figure 10).

현재 지원 되지 않는 행에 예 또는 아니요 값이 표시 됩니다.YES or NO Values are Now Shown in the Discontinued Row

그림 10: 예 또는 현재 중단 된 행에 값이 표시 되지 않음 (전체 크기 이미지를 보려면 클릭)Figure 10: YES or NO Values are Now Shown in the Discontinued Row (Click to view full-size image)

요약Summary

DetailsView 컨트롤의 Templatefield로 변환를 사용 하면 다른 필드 컨트롤에서 사용할 수 있는 것 보다 더 많은 유연성을 제공 하 여 데이터를 표시할 수 있으며, 다음과 같은 상황에 적합 합니다.The TemplateField in the DetailsView control allows for a higher degree of flexibility in displaying data than is available with the other field controls and are ideal for situations where:

  • 하나의 GridView 열에 여러 데이터 필드를 표시 해야 합니다.Multiple data fields need to be displayed in one GridView column
  • 데이터는 일반 텍스트가 아닌 웹 컨트롤을 사용 하 여 가장 잘 표현 됩니다.The data is best expressed using a Web control rather than plain text
  • 출력은 메타 데이터를 표시 하거나 데이터를 다시 포맷 하는 등의 기본 데이터에 따라 달라 집니다.The output depends on the underlying data, such as displaying metadata or in reformatting the data

서식 필드 필드는 DetailsView의 기본 데이터를 렌더링할 때 더 많은 유연성을 사용할 수 있지만 각 필드가 HTML <table>의 행으로 렌더링 되는 경우에도 DetailsView 출력은 약간의 느낌이 있습니다.While TemplateFields allow for a greater degree of flexibility in the rendering of the DetailsView's underlying data, the DetailsView output still feels a bit boxy as each field is rendered as a row in an HTML <table>.

FormView 컨트롤을 통해 렌더링 된 출력을 보다 유연 하 게 구성할 수 있습니다.The FormView control offers a greater degree of flexibility in configuring the rendered output. FormView는 필드를 포함 하지 않고 일련의 템플릿 (ItemTemplate, EditItemTemplate, HeaderTemplate등)만 포함 합니다.The FormView does not contain fields but rather just a series of templates (ItemTemplate, EditItemTemplate, HeaderTemplate, and so on). 다음 자습서에서 FormView를 사용 하 여 렌더링 된 레이아웃을 더욱 세밀 하 게 제어 하는 방법을 알아봅니다.We'll see how to use the FormView to achieve even more control of the rendered layout in our next tutorial.

행복 한 프로그래밍Happy Programming!

저자 정보About the Author

Scott Mitchell(7 개의 ASP/ASP. NET books 및 4GuysFromRolla.com창립자)은 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 2.0을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.com에 도달할 수 있습니다 .He can be reached at mitchell@4GuysFromRolla.com. 또는 블로그를 통해 http://ScottOnWriting.NET에서 찾을 수 있습니다.or via his blog, which can be found at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 이 자습서의 리드 검토자는 Dan Jagers입니다.Lead reviewer for this tutorial was Dan Jagers. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면mitchell@4GuysFromRolla.com에서 줄을 삭제 합니다.If so, drop me a line at mitchell@4GuysFromRolla.com.