데이터 바인딩 식 개요

Visual Studio 2010

업데이트: 2007년 11월

데이터 바인딩 구문을 사용하면 컨트롤 속성 값을 데이터에 바인딩하고 데이터를 검색, 업데이트 삭제 및 삽입하기 위한 값을 지정할 수 있습니다.

데이터 바인딩 식은 <%#%> 구분 기호 내에 포함되고 EvalBind 함수를 사용합니다. Eval 함수는 읽기 전용 단방향 바인딩을 정의하는 데 사용되고 Bind 함수는 업데이트 가능한 양방향 바인딩에 사용됩니다. EvalBind 메서드를 호출하여 데이터 바인딩 식의 데이터 바인딩을 수행할 수 있을 뿐만 아니라 <%#%> 구분 기호 내의 공개된 범위의 코드를 호출하여 해당 코드를 실행하고 페이지 처리 중에 값을 반환할 수 있습니다.

컨트롤 또는 Page 클래스의 DataBind 메서드가 호출되면 데이터 바인딩 식이 확인됩니다. GridView, DetailsViewFormView와 같은 컨트롤의 경우 해당 컨트롤의 PreRender 이벤트를 실행하는 동안 데이터 바인딩 식이 자동으로 확인되므로 DataBind 메서드를 명시적으로 호출할 필요가 없습니다.

다음 코드 예제에서는 ItemTemplate에서 FormView 컨트롤에 데이터 바인딩 식을 사용하는 것을 보여 줍니다.

<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                 
</asp:FormView>


Eval 메서드 사용

Eval 메서드는 GridView, DetailsViewFormView와 같은 데이터 바인딩된 컨트롤의 템플릿에서 런타임에 바인딩된 데이터 식을 계산합니다. 런타임에 Eval 메서드는 DataBinder 개체의 Eval 메서드를 호출하여 명명 컨테이너의 현재 데이터 항목을 참조합니다. 일반적으로 명명 컨테이너는 GridView 컨트롤의 행처럼 전체 레코드가 포함된 데이터 바인딩된 컨트롤의 최소 부분입니다. 따라서 데이터 바인딩된 컨트롤의 템플릿 안에서 바인딩할 경우에만 Eval 메서드를 사용할 수 있습니다.

Eval 메서드는 데이터 필드의 이름을 사용하고 데이터 소스의 현재 레코드에서 해당 필드의 값을 포함하는 문자열을 반환합니다. 선택적 요소인 두 번째 매개 변수를 제공하여 반환 문자열의 형식을 지정할 수 있습니다. 문자열 형식 매개 변수는 String 클래스의 Format 메서드에 정의된 구문을 사용합니다.

Bind 메서드 사용

Bind 메서드는 Eval 메서드와 비슷하지만 몇 가지 중요한 차이점이 있습니다. Eval 메서드와 마찬가지로 Bind 메서드를 사용하여 데이터 바인딩 필드의 값을 검색할 수 있지만 Bind 메서드는 데이터를 수정할 수 있는 경우에도 사용됩니다.

ASP.NET의 경우 GridView, DetailsView, FormView와 같은 데이터 바인딩된 컨트롤에서 데이터 소스 컨트롤의 업데이트, 삭제 및 삽입 작업을 자동으로 사용할 수 있습니다. 예를 들어 데이터 소스 컨트롤에 대해 SQL Select, Insert, Delete 및 Update 문을 정의한 경우 GridView, DetailsView 또는 FormView 컨트롤 템플릿에서 Bind 메서드를 사용하면 템플릿의 자식 컨트롤에서 값을 추출하여 데이터 소스 컨트롤에 전달할 수 있습니다. 그러면 데이터 소스 컨트롤에서 데이터베이스에 대해 적절한 명령을 수행합니다. 이러한 이유 때문에 Bind 함수는 데이터 바인딩된 컨트롤의 EditItemTemplate 또는 InsertItemTemplate 안에서 사용됩니다.

일반적으로 Bind 메서드는 편집 모드에서 GridView 행에 의해 렌더링되는 TextBox 컨트롤 같은 입력 컨트롤과 함께 사용됩니다. 데이터 바인딩된 컨트롤에서 렌더링하여 이러한 입력 컨트롤이 만들어지면 입력 값을 추출할 수 있습니다.

다음 예제와 같이 Bind 메서드는 바인딩된 속성에 연결할 데이터 필드의 이름을 사용합니다.

ms178366.alert_security(ko-kr,VS.100).gif보안 정보:

이 예제에는 사용자 입력을 허용하는 텍스트 상자가 있으므로 보안상 위험할 수 있습니다. 기본적으로 ASP.NET 페이지에서는 사용자 입력 내용에 스크립트나 HTML 요소가 포함되어 있지 않은지 유효성을 검사합니다. 자세한 내용은 스크립트 악용 개요를 참조하십시오.

<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
         
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

행의 Update 단추를 클릭하면 Bind 구문을 사용하여 바인딩된 각 컨트롤 속성의 값이 추출되어 업데이트 작업을 위해 데이터 소스 컨트롤에 전달됩니다.

GridView, FormViewDetailsView와 같은 컨트롤은 DataSourceID 속성을 사용하여 데이터 소스 컨트롤에 바인딩되어 있는 경우 DataBind 메서드를 암시적으로 호출하여 바인딩을 수행합니다. 그러나 DataBind 메서드를 명시적으로 호출해야 할 경우가 있습니다.

먼저 DataSourceID 속성 대신 DataSource 속성을 사용하여 컨트롤을 데이터 소스 컨트롤에 바인딩한 경우를 예로 들 수 있습니다. 이런 경우에는 DataBind 메서드를 명시적으로 호출하여 데이터 바인딩을 수행하고 데이터 바인딩 식을 확인해야 합니다.

또한 데이터 바인딩된 컨트롤에서 데이터를 수동으로 새로 고쳐야 할 경우에도 마찬가지입니다. 서로 다른 뷰를 사용하여 같은 데이터베이스의 정보를 표시하는 두 개의 컨트롤이 페이지에 포함되어 있는 경우를 가정해 봅니다. 이런 경우에는 컨트롤을 명시적으로 데이터에 다시 바인딩하여 데이터 표시를 동기화해야 합니다. 예를 들어 목록을 표시하는 GridView 컨트롤과 사용자가 각 제품을 편집할 수 있는 DetailsView 컨트롤을 포함할 수 있습니다. GridView 컨트롤과 DetailsView 컨트롤은 같은 소스의 데이터를 표시하지만 서로 다른 쿼리를 사용하여 데이터를 가져오므로 바인딩되는 데이터 소스 컨트롤이 다릅니다. 사용자가 DetailsView 컨트롤을 사용하여 레코드를 업데이트하면 연결된 데이터 소스 컨트롤에서 업데이트를 수행합니다. 그러나 GridView 컨트롤이 다른 데이터 소스 컨트롤에 바인딩되어 있으므로 페이지를 새로 고칠 때까지 이전 레코드 값이 표시됩니다. 따라서 DetailsView 컨트롤을 통해 데이터가 업데이트된 후에 DataBind 메서드를 호출할 수 있습니다. 이렇게 하면 <%#%> 구분 기호 내에서 공개된 범위의 코드와 데이터 바인딩 식을 다시 실행하여 GridView 컨트롤의 뷰도 업데이트됩니다. 그 결과 DetailsView 컨트롤을 통해 업데이트한 내용이 GridView 컨트롤에 반영됩니다.

데이터 바인딩된 컨트롤을 사용하는 일반적인 시나리오의 예로는 사용자가 DropDownList 컨트롤이나 기타 목록 컨트롤로 조회 테이블에서 값을 선택하여 해당 값을 업데이트하거나 삽입할 수 있게 하는 경우를 들 수 있습니다. 이 경우 조회 컨트롤은 가능한 값의 목록을 반환하는 별도의 데이터 소스에 바인딩되고 조회 컨트롤을 사용하여 선택한 값은 부모 데이터 바인딩된 행의 필드에 바인딩됩니다.

이 기능은 다음과 같이 추가할 수 있습니다. 우선, 조회 컨트롤에 대해 목록 컨트롤(DropDownList 또는 ListBox 컨트롤)을 GridView, DetailsView 또는 FormView 컨트롤 같은 데이터 바인딩된 컨트롤의 템플릿에 추가합니다. 컨테이너 컨트롤의 데이터 소스에 있는 관련 필드에 조회 컨트롤의 SelectedValue 속성을 바인딩합니다. 그런 다음 조회 값을 검색하는 데이터 소스 컨트롤로 조회 컨트롤의 DataSourceID 속성을 설정합니다. 조회 컨트롤의 DataTextField 속성을 표시할 값이 포함되어 있는 조회 테이블의 필드로 설정하고, 가능한 경우 해당 DataValueField 속성을 조회 값에 대한 고유한 식별자가 포함된 조회 테이블의 필드로 설정합니다.

다음 코드 예제에서는 FormView 컨트롤의 InsertItemTemplate 템플릿에 포함되어 있는 DropDownList 컨트롤을 보여 줍니다. 이는 DetailsView 컨트롤의 Fields 속성이나 GridView 컨트롤의 Columns 속성에 포함되어 있는 TemplateFieldInsertItemTemplate 템플릿일 수도 있습니다. DropDownList 컨트롤의 SelectedValue 속성에서는 FormView 컨트롤에 대한 현재 행의 CategoryID 필드를 양방향으로 바인딩하기 위해 Bind 메서드를 사용합니다. DropDownList 컨트롤의 DataSourceID 속성은 가능한 범주 이름과 ID의 목록을 검색하는 별도의 데이터 소스 컨트롤로 설정됩니다. DropDownList 컨트롤의 DataTextField 속성은 가능한 범주 이름의 목록을 표시할 수 있도록 조회 데이터 소스의 CategoryName 필드로 설정됩니다. DropDownList 컨트롤의 DataValueField 속성은 관련 범주 이름에 대한 조회 데이터 소스의 CategoryID 필드로 설정됩니다. 사용자가 목록에서 범주 이름을 선택하면 DropDownList 컨트롤의 SelectedValue 속성이 선택된 범주 이름에 대한 범주 ID로 설정됩니다.

<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>


동일한 목록 컨트롤을 사용하여 항목 템플릿을 편집할 수도 있습니다.

표시: