다음을 통해 공유


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

비고

클래스 및 관련 클래스는 DataSet 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 개체를 사용하여 간소화할 수 있는 몇 가지 표준 작업이 있습니다. 이 페이지에서는 TableAdapters를 사용하여 이러한 표준 프로세스를 구현하는 방법을 설명합니다. 사용자 지정 개체를 만들기 위한 지침은 아닙니다. 예를 들어 일반적으로 개체의 특정 구현 또는 애플리케이션 논리에 관계없이 다음 표준 작업을 수행합니다.

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

  • 형식화된 개체 컬렉션을 만듭니다.

  • 컬렉션에 개체를 추가하고 컬렉션에서 개체를 제거합니다.

  • 양식에서 사용자에게 개체 데이터를 표시합니다.

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

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

개체에 데이터 로드

이 예제에서는 TableAdapters를 사용하여 개체에 데이터를 로드합니다. 기본적으로 TableAdapters는 데이터베이스에서 데이터를 가져오고 데이터 테이블을 채우는 두 가지 종류의 메서드로 만들어집니다.

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

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

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

비고

Visual Studio는 TableAdapter 쿼리 Fill 의 이름을 지정하고 GetData 기본적으로 이름을 지정하지만 해당 이름을 유효한 메서드 이름으로 변경할 수 있습니다.

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

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 에 대해 a BindingList<T> 를 사용합니다. 애플리케이션에 추가 기능이 필요하지 않은 경우 .BindingSource 자세한 내용은 클래스의 List 속성을 참조하세요 BindingSource .

비고

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

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

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

컬렉션에 개체 추가

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

비고

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

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

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

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

비고

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

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

컬렉션에서 개체 제거

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

비고

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

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

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

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

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

개체의 데이터 수정

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

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

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

개체의 값을 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 메서드를 사용하여 각 개체의 값을 데이터베이스에 보냅니다.

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

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);
}