다음을 통해 공유


Visual Studio를 사용하여 .NET Framework 애플리케이션에서 개체를 데이터 원본으로 바인딩

참고 항목

데이터 집합 및 관련 클래스는 2000년대 초반에 적용된 레거시 .NET Framework 기술로, 응용 프로그램이 데이터베이스에서 연결이 끊어진 동안 응용 프로그램이 메모리의 데이터로 작업할 수 있도록 합니다. 사용자가 데이터를 수정하고 변경 내용을 다시 데이터베이스에 유지할 수 있도록 하는 애플리케이션에 특히 유용합니다. 데이터 세트는 매우 성공적인 기술로 입증되었지만 새 .NET 애플리케이션은 Entity Framework Core를 사용하는 것이 좋습니다. Entity Framework는 표 형식 데이터를 개체 모델로 사용하는 더 자연스러운 방법을 제공하며 더 단순한 프로그래밍 인터페이스를 제공합니다.

Visual Studio는 사용자 지정 개체를 애플리케이션의 데이터 원본으로 작업하기 위한 디자인 타임 도구를 제공합니다. UI 컨트롤에 바인딩하는 개체의 데이터베이스에서 데이터를 저장하려는 경우 Entity Framework를 사용하여 클래스를 생성하는 것이 좋습니다. Entity Framework는 모든 상용구 변경 추적 코드를 자동으로 생성합니다. 즉, DbSet 개체에서 AcceptChanges를 호출하면 로컬 개체에 대한 모든 변경 내용이 데이터베이스에 자동으로 유지됩니다. 자세한 내용은 Entity Framework 설명서를 참조하세요.

이 문서의 개체 바인딩에 대한 접근 방식은 애플리케이션이 이미 데이터 세트를 기반으로 하는 경우에만 고려해야 합니다. 데이터 세트에 이미 익숙하며 처리할 데이터가 테이블 형식이고 너무 복잡하거나 너무 크지 않은 경우에도 이러한 접근 방식을 사용할 수 있습니다. DataReader를 사용하여 개체에 직접 데이터를 로드하고 데이터 바인딩을 사용하지 않고 수동으로 UI를 업데이트하는 것을 포함하는 보다 간단한 예제를 보려면 ADO.NET를 사용하여 간단한 데이터 애플리케이션 만들기를 참조하세요.

개체 요구 사항

Visual Studio에서 데이터 디자인 도구를 사용하기 위한 사용자 지정 개체의 유일한 요구 사항은 개체에 하나 이상의 공용 속성이 있어야 한다는 것입니다.

일반적으로 사용자 지정 개체에는 애플리케이션의 데이터 원본 역할을 하는 특정 인터페이스, 생성자 또는 특성이 필요하지 않습니다. 그러나 데이터 원본 창에서 디자인 화면으로 개체를 끌어 데이터 바인딩된 컨트롤을 만들려는 경우 그리고 개체가 ITypedList 또는 IListSource 인터페이스를 구현하는 경우 개체에는 기본 생성자가 있어야 합니다. 그렇지 않으면 Visual Studio가 데이터 원본 개체를 인스턴스화할 수 없으며, 항목을 디자인 화면으로 끌 때 오류가 표시됩니다.

사용자 지정 개체를 데이터 원본으로 사용하는 예제

개체를 데이터 원본으로 사용할 때 애플리케이션 논리를 구현하는 방법은 매우 많지만 SQL 데이터베이스의 경우 Visual Studio에서 생성된 TableAdapter 개체를 사용하여 단순화할 수 있는 몇 가지 표준 작업이 있습니다. 이 페이지에서는 TableAdapter를 사용하여 이러한 표준 프로세스를 구현하는 방법을 설명합니다. 사용자 지정 개체를 만드는 방법에 대한 지침을 제공하지는 않습니다. 예를 들어 일반적으로 개체의 특정 구현 또는 애플리케이션의 논리에 관계없이 다음과 같은 표준 작업을 수행합니다.

  • 데이터를 개체에 로드(일반적으로 데이터베이스에서)

  • 개체의 형식화된 컬렉션 만들기

  • 컬렉션에서 개체를 추가 및 제거

  • 양식의 사용자에게 개체 데이터를 표시

  • 개체의 데이터를 변경/편집

  • 개체의 데이터를 데이터베이스에 다시 저장

데이터를 개체에 로드

이 예제에서는 TableAdapter를 사용하여 개체에 데이터를 로드합니다. 기본적으로 TableAdapter는 데이터베이스에서 데이터를 페치하고 데이터 테이블을 채우는 두 가지 종류의 메서드를 사용하여 생성됩니다.

  • TableAdapter.Fill 메서드는 기존 데이터 테이블을 반환된 데이터로 채웁니다.

  • TableAdapter.GetData 메서드는 데이터로 채워진 새 데이터 테이블을 반환합니다.

사용자 지정 개체에 데이터를 로드하는 가장 쉬운 방법은 TableAdapter.GetData 메서드를 호출하고, 반환된 데이터 테이블의 행 컬렉션을 반복하고, 각 개체를 각 행의 값으로 채우는 것입니다. TableAdapter에 추가된 쿼리에 대해 채워진 데이터 테이블을 반환하는 GetData 메서드를 만들 수 있습니다.

참고 항목

Visual Studio는 기본적으로 TableAdapter 쿼리 FillGetData에 이름을 지정하지만 이러한 이름을 유효한 메서드 이름으로 변경할 수 있습니다.

다음 예제에서는 데이터 테이블의 행을 반복하고 데이터를 사용하여 개체를 채우는 방법을 보여 줍니다.

private void LoadCustomers()
{
    NorthwindDataSet.CustomersDataTable customerData = 
        customersTableAdapter1.GetTop5Customers();
    
    foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
    {
        Customer currentCustomer = new Customer();
        currentCustomer.CustomerID = customerRow.CustomerID;
        currentCustomer.CompanyName = customerRow.CompanyName;

        if (customerRow.IsAddressNull() == false)
        {
            currentCustomer.Address = customerRow.Address;
        }

        if (customerRow.IsCityNull() == false)
        {
            currentCustomer.City = customerRow.City;
        }

        if (customerRow.IsContactNameNull() == false)
        {
            currentCustomer.ContactName = customerRow.ContactName;
        }

        if (customerRow.IsContactTitleNull() == false)
        {
            currentCustomer.ContactTitle = customerRow.ContactTitle;
        }

        if (customerRow.IsCountryNull() == false)
        {
            currentCustomer.Country = customerRow.Country;
        }

        if (customerRow.IsFaxNull() == false)
        {
            currentCustomer.Fax = customerRow.Fax;
        }

        if (customerRow.IsPhoneNull() == false)
        {
            currentCustomer.Phone = customerRow.Phone;
        }

        if (customerRow.IsPostalCodeNull() == false)
        {
            currentCustomer.PostalCode = customerRow.PostalCode;
        }

        if (customerRow.IsRegionNull() == false)
        {
            currentCustomer.Region = customerRow.Region;
        }

        LoadOrders(currentCustomer);
        customerBindingSource.Add(currentCustomer);
    }
}

개체의 형식화된 컬렉션 만들기

개체에 대한 컬렉션 클래스를 만들거나 BindingSource 구성 요소에서 자동으로 제공하는 형식화된 컬렉션을 사용할 수 있습니다.

개체에 대한 사용자 지정 컬렉션 클래스를 만들 때 BindingList<T>에서 상속하는 것이 좋습니다. 이 제네릭 클래스는 컬렉션을 관리하는 기능뿐만 아니라 Windows Forms의 데이터 바인딩 인프라에 알림을 보내는 이벤트를 발생시키는 기능을 제공합니다.

BindingSource에서 자동으로 생성된 컬렉션은 형식화된 컬렉션에 BindingList<T>를 사용합니다. 애플리케이션에 추가 기능이 필요하지 않은 경우 컬렉션을 BindingSource 내에서 유지할 수 있습니다. 자세한 내용은 BindingSource 클래스의 List 속성을 참조하세요.

참고 항목

컬렉션에 BindingList<T>의 기본 구현에서 제공하지 않는 기능이 필요한 경우 필요에 따라 클래스에 추가할 수 있도록 사용자 지정 컬렉션을 만들어야 합니다.

다음 코드에서는 Order 개체의 강력한 형식의 컬렉션에 대한 클래스를 만드는 방법을 보여 줍니다.

/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

컬렉션에 개체 추가

사용자 지정 컬렉션 클래스 또는 BindingSourceAdd 메서드를 호출하여 컬렉션에 개체를 추가합니다.

참고 항목

BindingList<T>에서 상속하는 경우 사용자 지정 컬렉션에 대해 Add 메서드가 자동으로 제공됩니다.

다음 코드에서는 BindingSource의 형식화된 컬렉션에 개체를 추가하는 방법을 보여 줍니다.

Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

다음 코드에서는 BindingList<T>에서 상속하는 형식화된 컬렉션에 개체를 추가하는 방법을 보여 줍니다.

참고 항목

이 예제에서 Orders 컬렉션은 Customer 개체의 속성입니다.

Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

컬렉션에서 개체 제거

사용자 지정 컬렉션 클래스 또는 BindingSourceRemove 또는 RemoveAt 메서드를 호출하여 컬렉션에서 개체를 제거합니다.

참고 항목

BindingList<T>에서 상속하는 경우 사용자 지정 컬렉션에 대해 RemoveRemoveAt 메서드가 자동으로 제공됩니다.

다음 코드에서는 RemoveAt 메서드를 사용하여 BindingSource의 형식화된 컬렉션에서 개체를 찾고 제거하는 방법을 보여 줍니다.

int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

사용자에게 개체 데이터 표시

사용자에게 개체의 데이터를 표시하려면 데이터 원본 구성 마법사를 사용하여 개체 데이터 원본를 만든 다음 데이터 원본 창에서 전체 개체 또는 개별 속성을 양식으로 끌어옵니다.

개체의 데이터 수정

Windows Forms 컨트롤에 데이터 바인딩된 사용자 지정 개체의 데이터를 편집하려면 바인딩된 컨트롤에서 데이터를 편집하거나 개체의 속성에서 직접 편집하면 됩니다. 데이터 바인딩 아키텍처가 개체의 데이터를 업데이트합니다.

애플리케이션이 변경 내용을 추적해야 하고 제안된 변경 내용을 원래 값으로 롤백하는 경우 개체 모델에서 이 기능을 구현해야 합니다. 데이터 테이블이 제안된 변경 내용을 추적하는 방법에 대한 예는 DataRowState, HasChangesGetChanges을 참조하세요.

개체의 데이터를 데이터베이스에 다시 저장

개체의 값을 TableAdapter의 DBDirect 메서드로 전달하여 데이터를 데이터베이스에 다시 저장합니다.

Visual Studio가 데이터베이스에 대해 직접 실행할 수 있는 DBDirect 메서드를 만듭니다. 이러한 메서드에는 DataSet 또는 DataTable 개체가 필요하지 않습니다.

TableAdapter DBDirect 메서드 설명
TableAdapter.Insert 개별 열 값을 메서드 매개 변수로 전달할 수 있도록 데이터베이스에 새 레코드를 추가합니다.
TableAdapter.Update 데이터베이스의 기존 레코드를 업데이트합니다. Update 메서드는 원래 열 값과 새 열 값을 메서드 매개 변수로 사용합니다. 원래 값을 사용하여 원래 레코드를 찾은 다음 새 값을 사용하여 해당 레코드를 업데이트합니다.

TableAdapter.Update 메서드는 DataSet, DataTable, DataRow 또는 DataRow의 배열을 메서드 매개 변수로 사용하여 데이터 세트의 변경 내용을 데이터베이스로 다시 조정하는 데도 사용됩니다.
TableAdapter.Delete 메서드 매개 변수로 전달된 원래 열 값을 기준으로 데이터베이스에서 기존 레코드를 삭제합니다.

개체의 컬렉션에서 데이터를 저장하려면 개체의 컬렉션을 반복합니다(예를 들어 for-next 루프를 사용). TableAdapter의 DBDirect 메서드를 사용하여 각 개체의 값을 데이터베이스로 보냅니다.

다음 예제에서는 TableAdapter.Insert DBDirect 메서드를 사용하여 신규 고객을 데이터베이스에 직접 추가하는 방법을 보여 줍니다.

private void AddNewCustomers(Customer currentCustomer)
{
    customersTableAdapter.Insert( 
        currentCustomer.CustomerID, 
        currentCustomer.CompanyName, 
        currentCustomer.ContactName, 
        currentCustomer.ContactTitle, 
        currentCustomer.Address, 
        currentCustomer.City, 
        currentCustomer.Region, 
        currentCustomer.PostalCode, 
        currentCustomer.Country, 
        currentCustomer.Phone, 
        currentCustomer.Fax);
}