다음을 통해 공유


데이터에 따라 사용자 지정 형식 지정(C#)

작성자 : Scott Mitchell

PDF 다운로드

바인딩된 데이터를 기반으로 GridView, DetailsView 또는 FormView의 형식을 조정하는 작업은 여러 가지 방법으로 수행할 수 있습니다. 이 자습서에서는 DataBound 및 RowDataBound 이벤트 처리기를 사용하여 데이터 바인딩된 서식을 수행하는 방법을 살펴봅니다.

소개

GridView, DetailsView 및 FormView 컨트롤의 모양은 다양한 스타일 관련 속성을 통해 사용자 지정할 수 있습니다. , , Font, BorderWidth, BorderColorBorderStyle, Width및 와 Height같은 CssClass속성은 렌더링된 컨트롤의 일반적인 모양을 결정합니다. , RowStyle, AlternatingRowStyle및 기타 등의 HeaderStyle속성을 사용하면 이러한 동일한 스타일 설정을 특정 섹션에 적용할 수 있습니다. 마찬가지로 이러한 스타일 설정은 필드 수준에서 적용할 수 있습니다.

하지만 많은 시나리오에서 서식 요구 사항은 표시된 데이터의 값에 따라 달라집니다. 예를 들어 품절 제품에 관심을 끌기 위해 제품 정보를 나열하는 보고서에서 및 UnitsOnOrder 필드가 모두 0인 제품의 UnitsInStock 배경색을 노란색으로 설정할 수 있습니다. 더 비싼 제품을 강조하기 위해 굵은 글꼴로 $ 75.00 이상의 비용이 드는 제품의 가격을 표시 할 수 있습니다.

바인딩된 데이터를 기반으로 GridView, DetailsView 또는 FormView의 형식을 조정하는 작업은 여러 가지 방법으로 수행할 수 있습니다. 이 자습서에서는 및 RowDataBound 이벤트 처리기를 사용하여 DataBound 데이터 바인딩된 서식을 수행하는 방법을 살펴봅니다. 다음 자습서에서는 대체 방법을 살펴보겠습니다.

DetailsView 컨트롤의DataBound이벤트 처리기 사용

데이터가 데이터 소스 컨트롤에서 또는 프로그래밍 방식으로 컨트롤의 DataSource 속성에 데이터를 할당하고 메서드 DataBind() 를 호출하여 DetailsView에 바인딩되는 경우 다음 단계 시퀀스가 발생합니다.

  1. 데이터 웹 컨트롤의 DataBinding 이벤트가 발생합니다.
  2. 데이터는 데이터 웹 컨트롤에 바인딩됩니다.
  3. 데이터 웹 컨트롤의 DataBound 이벤트가 발생합니다.

사용자 지정 논리는 이벤트 처리기를 통해 1단계와 3단계 직후에 삽입할 수 있습니다. 이벤트에 대한 DataBound 이벤트 처리기를 만들어서 데이터 웹 컨트롤에 바인딩된 데이터를 프로그래밍 방식으로 확인하고 필요에 따라 서식을 조정할 수 있습니다. 이를 설명하기 위해 제품에 대한 일반 정보를 나열하지만 값이 $75.00를 초과하는 경우 굵은 기울임꼴 글꼴로 표시되는 UnitPrice DetailsView를 만들어 보겠습니다.

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

폴더에서 CustomColors.aspxCustomFormatting 페이지를 열고 Toolbox에서 Designer DetailsView 컨트롤을 끌어 속성 ID 값을 ExpensiveProductsPriceInBoldItalic로 설정한 다음 클래스의 GetProducts() 메서드를 호출하는 새 ObjectDataSource 컨트롤에 바인딩합니다ProductsBLL. 이 작업을 수행하기 위한 자세한 단계는 이전 자습서에서 자세히 살펴보기 때문에 간결하게 하기 위해 여기에서 생략되었습니다.

ObjectDataSource를 DetailsView에 바인딩한 후 잠시 시간을 내어 필드 목록을 수정합니다. , , SupplierID, UnitsOnOrderUnitsInStockCategoryIDReorderLevelDiscontinued BoundFields를 ProductID제거하도록 선택했고 나머지 BoundFields의 이름을 바꾸고 다시 포맷했습니다. 또한 및 Height 설정을 지 Width 웠다. DetailsView는 단일 레코드만 표시하므로 최종 사용자가 모든 제품을 볼 수 있도록 페이징을 사용하도록 설정해야 합니다. 이렇게 하려면 DetailsView의 스마트 태그에서 페이징 사용 확인란을 선택합니다.

DetailsView의 스마트 태그에서 페이징 사용 확인란을 선택합니다.

그림 1: DetailsView의 스마트 태그에서 페이징 사용 확인란을 선택합니다(전체 크기 이미지를 보려면 클릭).

이러한 변경 후 DetailsView 태그는 다음과 같습니다.

<asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True"
    AutoGenerateRows="False" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" 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" DataFormatString="{0:c}"
          HeaderText="Price"
            HtmlEncode="False" SortExpression="UnitPrice" />
    </Fields>
</asp:DetailsView>

잠시 시간을 내어 브라우저에서 이 페이지를 테스트합니다.

DetailsView 컨트롤은 한 번에 하나의 제품을 표시합니다.

그림 2: DetailsView 컨트롤은 한 번에 하나의 제품을 표시합니다(전체 크기 이미지를 보려면 클릭).

2단계: 프로그래밍 방식으로 DataBound 이벤트 처리기에서 데이터 값 확인

값이 $75.00를 초과하는 제품의 UnitPrice 굵은 기울임꼴 글꼴로 가격을 표시하려면 먼저 프로그래밍 방식으로 값을 결정할 UnitPrice 수 있어야 합니다. DetailsView의 경우 이벤트 처리기에서 DataBound 이 작업을 수행할 수 있습니다. 이벤트 처리기를 만들려면 Designer DetailsView를 클릭한 다음 속성 창 이동합니다. F4 키를 눌러 표시하지 않으면 표시하거나 보기 메뉴로 이동하여 속성 창 메뉴 옵션을 선택합니다. 속성 창 번개 아이콘을 클릭하여 DetailsView의 이벤트를 나열합니다. 다음으로, 이벤트를 두 번 클릭 DataBound 하거나 만들려는 이벤트 처리기의 이름을 입력합니다.

DataBound 이벤트에 대한 이벤트 처리기 만들기

그림 3: 이벤트에 대한 DataBound 이벤트 처리기 만들기

이렇게 하면 이벤트 처리기가 자동으로 만들어지고 추가된 코드 부분으로 연결됩니다. 이 시점에서 다음이 표시됩니다.

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{

}

DetailsView에 바인딩된 데이터는 속성을 통해 DataItem 액세스할 수 있습니다. 강력한 형식의 DataRow 인스턴스 컬렉션으로 구성된 강력한 형식의 DataTable에 컨트롤을 바인딩하고 있습니다. DataTable이 DetailsView에 바인딩되면 DataTable의 첫 번째 DataRow가 DetailsView의 DataItem 속성에 할당됩니다. 특히 속성에는 DataItem 개체가 DataRowView 할당됩니다. 의 Row 속성을 사용하여 DataRowView실제로 instance 기본 DataRow 개체에 ProductsRow 액세스할 수 있습니다. 이 ProductsRow instance 있으면 단순히 개체의 속성 값을 검사하여 결정을 내릴 수 있습니다.

다음 코드는 DetailsView 컨트롤에 바인딩된 값이 UnitPrice $75.00보다 큰지 여부를 확인하는 방법을 보여 줍니다.

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)ExpensiveProductsPriceInBoldItalic.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice > 75m)
    {
        // TODO: Make the UnitPrice text bold and italic
    }
}

참고

UnitPrice 는 데이터베이스에 값을 가질 NULL 수 있으므로 먼저 의 속성에 액세스 ProductsRowUnitPrice 하기 전에 값을 처리 NULL 하지 않는지 확인하는 검사. 값이 있을 때 NULLProductsRow 속성에 UnitPrice 액세스하려고 하면 개체가 StrongTypingException 예외를 throw하기 때문에 이 검사 중요합니다.

3단계: DetailsView에서 UnitPrice 값 서식 지정

이 시점에서 DetailsView에 바인딩된 값에 $75.00를 초과하는 값이 있는지 확인할 UnitPrice 수 있지만, 이에 따라 DetailsView의 서식을 프로그래밍 방식으로 조정하는 방법은 아직 결정되지 않았습니다. DetailsView에서 전체 행의 서식을 수정하려면 를 사용하여 DetailsViewID.Rows[index]행에 프로그래밍 방식으로 액세스합니다. 특정 셀을 수정하려면 에 액세스 DetailsViewID.Rows[index].Cells[index]합니다. 행 또는 셀에 대한 참조가 있으면 스타일 관련 속성을 설정하여 모양을 조정할 수 있습니다.

프로그래밍 방식으로 행에 액세스하려면 0에서 시작하는 행의 인덱스를 알고 있어야 합니다. 행은 UnitPrice DetailsView의 다섯 번째 행으로, 인덱스 4를 제공하고 를 사용하여 ExpensiveProductsPriceInBoldItalic.Rows[4]프로그래밍 방식으로 액세스할 수 있도록 합니다. 이 시점에서 다음 코드를 사용하여 전체 행의 콘텐츠를 굵은 기울임꼴 글꼴로 표시할 수 있습니다.

ExpensiveProductsPriceInBoldItalic.Rows[4].Font.Bold = true;
ExpensiveProductsPriceInBoldItalic.Rows[4].Font.Italic = true;

그러나 레이블(Price)과 값이 굵 게 표시되고 기울임꼴이 됩니다. 값만 굵게, 기울임꼴로 만들려면 행의 두 번째 셀에 이 서식을 적용해야 합니다. 이 서식은 다음을 사용하여 수행할 수 있습니다.

ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].Font.Bold = true;
ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].Font.Italic = true;

지금까지 자습서에서는 스타일시트를 사용하여 위에 표시된 대로 특정 스타일 속성을 설정하는 대신 CSS 클래스를 사용하는 대신 렌더링된 태그와 스타일 관련 정보 간의 클린 구분을 유지했습니다. Styles.css 스타일시트를 열고 다음 정의를 사용하여 라는 ExpensivePriceEmphasis 새 CSS 클래스를 추가합니다.

.ExpensivePriceEmphasis
{
    font-weight: bold;
    font-style: italic;
}

그런 다음 이벤트 처리기에서 DataBound 셀의 CssClass 속성을 로 ExpensivePriceEmphasis설정합니다. 다음 코드는 이벤트 처리기를 전체적으로 보여 DataBound 제공합니다.

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)ExpensiveProductsPriceInBoldItalic.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice > 75m)
    {
        ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].CssClass =
            "ExpensivePriceEmphasis";
    }
}

$75.00 미만의 비용이 드는 Chai를 볼 때 가격은 일반 글꼴로 표시됩니다(그림 4 참조). 그러나 가격이 $97.00인 미시 고베 니쿠를 볼 때 가격은 굵은 기울임꼴 글꼴로 표시됩니다(그림 5 참조).

$75.00 미만의 가격은 일반 글꼴로 표시됩니다.

그림 4: $75.00 미만의 가격이 일반 글꼴로 표시됩니다(전체 크기 이미지를 보려면 클릭).

고가의 제품 가격은 굵은 기울임꼴 글꼴로 표시됩니다.

그림 5: 고가의 제품 가격이 굵은 기울임꼴 글꼴로 표시됩니다(전체 크기 이미지를 보려면 클릭).

FormView 컨트롤의DataBound이벤트 처리기 사용

FormView에 바인딩된 기본 데이터를 결정하는 단계는 DetailsView 이벤트 처리기를 만들고 DataBound , 속성을 컨트롤에 바인딩된 적절한 개체 형식으로 캐스팅 DataItem 하고, 진행 방법을 결정하는 단계와 동일합니다. 그러나 FormView 및 DetailsView는 사용자 인터페이스의 모양이 업데이트되는 방식과 다릅니다.

FormView에는 BoundFields가 없으므로 컬렉션이 Rows 부족합니다. 대신 FormView는 정적 HTML, 웹 컨트롤 및 데이터 바인딩 구문을 혼합하여 포함할 수 있는 템플릿으로 구성됩니다. FormView의 스타일을 조정하려면 일반적으로 FormView의 템플릿 내에서 하나 이상의 웹 컨트롤 스타일을 조정해야 합니다.

이를 설명하기 위해 FormView를 사용하여 이전 예제와 같은 제품을 나열해 보겠습니다. 이번에는 10보다 작거나 같은 경우 재고 단위가 빨간색 글꼴로 표시된 재고 단위와 함께 재고의 제품 이름 및 단위만 표시해 보겠습니다.

4단계: FormView에 제품 정보 표시

DetailsView 아래 페이지에 CustomColors.aspx FormView를 추가하고 해당 ID 속성을 로 LowStockedProductsInRed설정합니다. FormView를 이전 단계에서 만든 ObjectDataSource 컨트롤에 바인딩합니다. 그러면 FormView에 ItemTemplate대한 , EditItemTemplateInsertItemTemplate 가 생성됩니다. 및 를 EditItemTemplateInsertItemTemplate 제거하고 를 단순화 ItemTemplate 하여 각각 적절한 이름의 레이블 컨트롤에 및 UnitsInStock 값만 ProductName 포함합니다. 이전 예제의 DetailsView와 마찬가지로 FormView의 스마트 태그에 페이징 사용 확인란도 검사.

이러한 편집 후 FormView의 태그는 다음과 유사하게 표시됩니다.

<asp:FormView ID="LowStockedProductsInRed" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True"
    EnableViewState="False" runat="server">
    <ItemTemplate>
        <b>Product:</b>
        <asp:Label ID="ProductNameLabel" runat="server"
         Text='<%# Bind("ProductName") %>'>
        </asp:Label><br />
        <b>Units In Stock:</b>
        <asp:Label ID="UnitsInStockLabel" runat="server"
          Text='<%# Bind("UnitsInStock") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:FormView>

에는 다음 ItemTemplate 이 포함됩니다.

  • 정적 HTML 은 및 요소와 함께 "Product:" 및 "Units In Stock:" 텍스트입니다 <br /><b> .
  • 웹은 및 두 레이블 컨트롤을 제어합니다 ProductNameLabelUnitsInStockLabel.
  • Databinding 구문<%# Bind("ProductName") %><%# Bind("UnitsInStock") %> 구문으로, 이러한 필드의 값을 Label 컨트롤의 Text 속성에 할당합니다.

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

FormView의 태그가 완료되면 다음 단계는 값이 10보다 작거나 같은지 UnitsInStock 프로그래밍 방식으로 확인하는 것입니다. 이 작업은 DetailsView와 동일한 방식으로 FormView에서 수행됩니다. FormView DataBound 의 이벤트에 대한 이벤트 처리기를 만들어 시작합니다.

DataBound 이벤트 처리기 만들기

그림 6: 이벤트 처리기 만들기 DataBound

이벤트 처리기에서 FormView의 DataItem 속성을 ProductsRow instance 캐스팅하고 값이 빨간색 글꼴로 표시되어야 하는지 여부를 UnitsInPrice 확인합니다.

protected void LowStockedProductsInRed_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)LowStockedProductsInRed.DataItem).Row;
    if (!product.IsUnitsInStockNull() && product.UnitsInStock <= 10)
    {
        // TODO: Make the UnitsInStockLabel text red
    }
}

6단계: FormView의 ItemTemplate에서 UnitsInStockLabel 레이블 컨트롤 서식 지정

마지막 단계는 값이 10 이하인 경우 표시된 UnitsInStock 값의 서식을 빨간색 글꼴로 지정하는 것입니다. 이렇게 하려면 의 컨트롤에 UnitsInStockLabelItemTemplate 프로그래밍 방식으로 액세스하고 해당 텍스트가 빨간색으로 표시되도록 스타일 속성을 설정해야 합니다. 템플릿에서 웹 컨트롤에 액세스하려면 다음과 같은 메서드를 FindControl("controlID") 사용합니다.

WebControlType someName = (WebControlType)FormViewID.FindControl("controlID");

이 예제에서는 값UnitsInStockLabel이 인 ID Label 컨트롤에 액세스하려고 하므로 다음을 사용합니다.

Label unitsInStock =
    (Label)LowStockedProductsInRed.FindControl("UnitsInStockLabel");

웹 컨트롤에 대한 프로그래밍 방식 참조가 있으면 필요에 따라 스타일 관련 속성을 수정할 수 있습니다. 이전 예제와 마찬가지로 라는 LowUnitsInStockEmphasis에서 CSS 클래스를 Styles.css 만들었습니다. 레이블 웹 컨트롤에 이 스타일을 적용하려면 해당 CssClass 속성을 적절하게 설정합니다.

protected void LowStockedProductsInRed_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)LowStockedProductsInRed.DataItem).Row;
    if (!product.IsUnitsInStockNull() && product.UnitsInStock <= 10)
    {
        Label unitsInStock =
            (Label)LowStockedProductsInRed.FindControl("UnitsInStockLabel");

        if (unitsInStock != null)
        {
          unitsInStock.CssClass = "LowUnitsInStockEmphasis";
        }
    }
}

참고

DetailsView 또는 GridView 컨트롤에서 TemplateFields를 사용할 때 스타일 관련 속성을 사용하여 FindControl("controlID") 프로그래밍 방식으로 웹 컨트롤에 액세스하는 템플릿의 서식을 지정하는 구문을 사용할 수도 있습니다. 다음 자습서에서는 TemplateFields를 살펴보겠습니다.

그림 7은 값이 UnitsInStock 10보다 큰 제품을 볼 때 FormView를 보여 주며 그림 8의 제품은 해당 값이 10보다 작습니다.

재고가 충분히 큰 제품의 경우 사용자 지정 서식이 적용되지 않습니다.

그림 7: 재고가 충분히 큰 제품의 경우 사용자 지정 서식이 적용되지 않습니다(전체 크기 이미지를 보려면 클릭).

재고 번호의 단위는 값이 10 이하인 제품의 경우 빨간색으로 표시됩니다.

그림 8: 재고 수의 단위는 값이 10 이하인 제품에 대해 빨간색으로 표시됩니다(전체 크기 이미지를 보려면 클릭).

GridView의RowDataBound이벤트를 사용하여 서식 지정

앞서 데이터 바인딩 중에 DetailsView 및 FormView가 진행 상황을 제어하는 단계의 시퀀스를 검토했습니다. 이러한 단계를 다시 한 번 새로 고침으로 살펴보겠습니다.

  1. 데이터 웹 컨트롤의 DataBinding 이벤트가 발생합니다.
  2. 데이터는 데이터 웹 컨트롤에 바인딩됩니다.
  3. 데이터 웹 컨트롤의 DataBound 이벤트가 발생합니다.

이 세 가지 간단한 단계는 DetailsView 및 FormView에 대해 단일 레코드만 표시하므로 충분합니다. 첫 번째 레코드뿐만 아니라 바인딩된 모든 레코드를 표시하는 GridView의 경우 2단계가 좀 더 복잡합니다.

2단계에서 GridView는 데이터 원본을 열거하고 각 레코드에 대해 instance 만들고 GridViewRow 현재 레코드를 바인딩합니다. GridView에 추가된 각 GridViewRow 이벤트에 대해 두 개의 이벤트가 발생합니다.

  • RowCreatedGridViewRow 생성된 후 발생합니다.
  • RowDataBound 는 현재 레코드가 에 바인딩된 후에 발생합니다 GridViewRow.

GridView의 경우 데이터 바인딩은 다음 단계 시퀀스를 통해 보다 정확하게 설명됩니다.

  1. GridView의 DataBinding 이벤트가 발생합니다.

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

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

    1. GridViewRow 개체 만들기
    2. RowCreated 이벤트 발생
    3. 레코드를 에 바인딩 GridViewRow
    4. RowDataBound 이벤트 발생
    5. 컬렉션에 GridViewRow 을 추가합니다.Rows
  3. GridView의 DataBound 이벤트가 발생합니다.

GridView의 개별 레코드 형식을 사용자 지정하려면 이벤트에 대한 RowDataBound 이벤트 처리기를 만들어야 합니다. 이를 설명하기 위해 CustomColors.aspx 각 제품의 이름, 범주 및 가격을 나열하는 페이지에 GridView를 추가하여 가격이 노란색 배경색인 $10.00 미만의 제품을 강조 표시해 보겠습니다.

7단계: GridView에 제품 정보 표시

이전 예제의 FormView 아래에 GridView를 추가하고 해당 ID 속성을 로 HighlightCheapProducts설정합니다. 페이지의 모든 제품을 반환하는 ObjectDataSource가 이미 있으므로 GridView를 바인딩합니다. 마지막으로 GridView의 BoundFields를 편집하여 제품의 이름, 범주 및 가격만 포함합니다. 이러한 편집 후 GridView의 태그는 다음과 같습니다.

<asp:GridView ID="HighlightCheapProducts" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
    EnableViewState="False" runat="server">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
          SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
          ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
          HeaderText="Price"
            HtmlEncode="False" SortExpression="UnitPrice" />
    </Columns>
</asp:GridView>

그림 9는 브라우저를 통해 볼 때 이 시점까지의 진행률을 보여줍니다.

GridView는 각 제품의 이름, 범주 및 가격을 Lists.

그림 9: GridView는 각 제품의 이름, 범주 및 가격을 Lists(전체 크기 이미지를 보려면 클릭)

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

ProductsDataTable GridView에 바인딩되면 해당 ProductsRow 인스턴스가 열거되고 각 ProductsRowGridViewRow 대해 이 만들어집니다. GridViewRowDataItem 속성은 특정 ProductRow에 할당된 후 GridView의 RowDataBound 이벤트 처리기가 발생합니다. GridView에 UnitPrice 바인딩된 각 제품의 값을 확인하려면 GridView 이벤트에 RowDataBound 대한 이벤트 처리기를 만들어야 합니다. 이 이벤트 처리기에서 현재 GridViewRow 값을 검사 UnitPrice 하고 해당 행에 대한 서식을 결정할 수 있습니다.

이 이벤트 처리기는 FormView 및 DetailsView와 동일한 일련의 단계를 사용하여 만들 수 있습니다.

GridView의 RowDataBound 이벤트에 대한 이벤트 처리기 만들기

그림 10: GridView의 RowDataBound 이벤트에 대한 이벤트 처리기 만들기

이러한 방식으로 이벤트 처리기를 만들면 다음 코드가 ASP.NET 페이지의 코드 부분에 자동으로 추가됩니다.

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{

}

RowDataBound 이벤트가 실행되면 이벤트 처리기는 라는 속성Row이 있는 형식GridViewRowEventArgs의 개체인 두 번째 매개 변수로 전달됩니다. 이 속성은 데이터 바인딩된 에 GridViewRow 대한 참조를 반환합니다. 에 바인딩된 ProductsRowGridViewRow instance 액세스하려면 다음과 같이 속성을 사용합니다DataItem.

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((System.Data.DataRowView)e.Row.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
    {
        // TODO: Highlight the row yellow...
    }
}

이벤트 처리기로 작업 RowDataBound 할 때 GridView는 다양한 유형의 행으로 구성되며 모든 행 형식에 대해 이 이벤트가 발생한다는 점을 명심해야 합니다. 의 형식은 GridViewRow해당 RowType 속성에 의해 결정될 수 있으며 가능한 값 중 하나를 가질 수 있습니다.

  • DataRow GridView의 레코드에 바인딩된 행 DataSource
  • EmptyDataRow GridView DataSource 가 비어 있는 경우 표시되는 행
  • Footer 바닥글 행; GridView의 ShowFooter 속성이 로 설정된 경우 표시 true
  • Header 머리글 행; GridView의 ShowHeader 속성이 (기본값)으로 true 설정된 경우 표시됨
  • Pager 페이징을 구현하는 GridView의 경우 페이징 인터페이스를 표시하는 행입니다.
  • Separator GridView에는 사용되지 않지만 DataList 및 Repeater 컨트롤의 속성에 사용되는 RowType 두 가지 데이터 웹 컨트롤은 향후 자습서에서 설명합니다.

, , 및 행은 레코드와 DataSourcePager 연결되지 않으므로 항상 해당 DataItem 속성에 null 대한 값을 갖습니다. FooterHeaderEmptyDataRow 이러한 이유로 현재 GridViewRowDataItem 속성을 사용하려고 시도하기 전에 먼저 를 처리 DataRow하고 있는지 확인해야 합니다. 이 작업은 다음과 같이 의 RowType 속성을 확인하여 GridViewRow수행할 수 있습니다.

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Make sure we are working with a DataRow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get the ProductsRow object from the DataItem property...
        Northwind.ProductsRow product = (Northwind.ProductsRow)
            ((System.Data.DataRowView)e.Row.DataItem).Row;
        if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
        {
          // TODO: Highlight row yellow...
        }
    }
}

9단계: UnitPrice 값이 $10.00 미만일 때 행 노란색 강조 표시

마지막 단계는 해당 행의 값이 $10.00 미만인 경우 UnitPrice 전체 GridViewRow 를 프로그래밍 방식으로 강조 표시하는 것입니다. GridView의 행 또는 셀에 액세스하는 구문은 DetailsView GridViewID.Rows[index] 와 동일하여 전체 행 GridViewID.Rows[index].Cells[index] 에 액세스하여 특정 셀에 액세스합니다. 그러나 이벤트 처리기가 실행될 때 RowDataBound 데이터 바인딩 GridViewRow 은 아직 GridView의 Rows 컬렉션에 추가되지 않았습니다. 따라서 Rows 컬렉션을 사용하여 이벤트 처리기에서 RowDataBound 현재 GridViewRow instance 액세스할 수 없습니다.

대신 GridViewID.Rows[index]를 사용하여 e.Row이벤트 처리기에서 RowDataBound 현재 GridViewRow instance 참조할 수 있습니다. 즉, 이벤트 처리기의 현재 GridViewRow instance 강조 표시하기 위해 다음을 RowDataBound 사용합니다.

e.Row.BackColor = System.Drawing.Color.Yellow;

BackColor 속성을 직접 설정하는 GridViewRow대신 CSS 클래스를 사용하여 계속 살펴보겠습니다. 배경색을 노란색으로 설정하는 CSS AffordablePriceEmphasis 클래스를 만들었습니다. 완료된 RowDataBound 이벤트 처리기는 다음과 같습니다.

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Make sure we are working with a DataRow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get the ProductsRow object from the DataItem property...
        Northwind.ProductsRow product = (Northwind.ProductsRow)
            ((System.Data.DataRowView)e.Row.DataItem).Row;
        if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
        {
            e.Row.CssClass = "AffordablePriceEmphasis";
        }
    }
}

가장 저렴한 제품은 노란색으로 강조 표시되어 있습니다.

그림 11: 가장 저렴한 제품은 노란색으로 강조 표시됨(전체 크기 이미지를 보려면 클릭)

요약

이 자습서에서는 컨트롤에 바인딩된 데이터에 따라 GridView, DetailsView 및 FormView의 서식을 지정하는 방법을 알아보았습니다. 이를 위해 필요한 경우 서식 변경과 함께 기본 데이터를 검사한 또는 RowDataBound 이벤트에 대한 DataBound 이벤트 처리기를 만들었습니다. DetailsView 또는 FormView에 바인딩된 데이터에 액세스하려면 이벤트 처리기에서 속성을 사용합니다DataItem. GridView의 DataItem 경우 각 GridViewRow instance 속성에는 이벤트 처리기에서 사용할 수 있는 해당 행에 RowDataBound 바인딩된 데이터가 포함 DataBound 됩니다.

프로그래밍 방식으로 데이터 웹 컨트롤의 서식을 조정하기 위한 구문은 웹 컨트롤과 서식을 지정할 데이터가 표시되는 방식에 따라 달라집니다. DetailsView 및 GridView 컨트롤의 경우 서수 인덱스를 통해 행과 셀에 액세스할 수 있습니다. 템플릿을 사용하는 FormView의 FindControl("controlID") 경우 메서드는 일반적으로 템플릿 내에서 웹 컨트롤을 찾는 데 사용됩니다.

다음 자습서에서는 GridView 및 DetailsView에서 템플릿을 사용하는 방법을 살펴보겠습니다. 또한 기본 데이터를 기반으로 서식을 사용자 지정하는 또 다른 기술이 표시됩니다.

행복한 프로그래밍!

저자 정보

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

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 E.R. 길모어, 데니스 패터슨, 댄 재저스였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 에 줄을 놓습니다 mitchell@4GuysFromRolla.com.