共用方式為


Visual Studio 中的物件繫結

Visual Studio 提供了一些設計階段工具,可將自訂物件 (而非其他資料來源如實體、資料集和服務) 當做應用程式中的資料來源使用。

物件需求

要讓自訂物件與 Visual Studio 中的資料設計工具搭配使用,唯一的要求就是物件至少需要有一個公用屬性。

自訂物件通常並不需要特定的介面、建構函式或屬性,即可做為應用程式的資料來源。 不過,如果您要從 [資料來源] 視窗將物件拖曳至設計介面以建立資料繫結控制項,而且如果此物件實作 ITypedListIListSource 介面,物件必須有預設建構函式 (即無參數的建構函式)。 否則,Visual Studio 無法執行個體化資料來源物件,而且當您將項目拖曳至設計介面時會顯示錯誤。

使用自訂物件做為資料來源的範例

雖然將物件當做資料來源使用時,有不計其數的方式可實作應用程式邏輯,但是只有少數標準作業可藉由使用 Visual Studio 產生的 TableAdapter 物件加以簡化。 這個頁面將會說明如何使用 TableAdapter 實作這些標準處理序。不過,這並不是要做為建立自訂物件的指引。 例如,您通常會執行下列標準作業,而不論物件或應用程式邏輯的特定實作為何:

  • 將資料載入物件中 (通常是從資料庫)。

  • 建立物件的具型別集合。

  • 將物件加入至集合或從集合移除物件。

  • 將表單上的物件資料顯示給使用者。

  • 變更/編輯物件中的資料。

  • 將物件的資料儲存回資料庫中。

注意事項注意事項

為了深入瞭解並提供這個頁面上範例的內容,我們建議您完成下列逐步解說:連接至物件中的資料 (Windows Form)。 該逐步解說會建立這個說明網頁上討論的物件。

將資料載入物件中

在這個範例中,您會使用 TableAdapter 將資料載入物件中。 根據預設,TableAdapter 是透過從資料庫擷取資料和填入資料表的兩種方法所建立。

  • TableAdapter.Fill 方法會以傳回的資料填入現有的資料表。

  • TableAdapter.GetData 方法會傳回以資料填入的新資料表。

將資料載入自訂物件最簡單的方式,就是呼叫 TableAdapter.GetData 方法、在傳回資料表的資料列集合中執行迴圈 (Loop),然後使用每個資料列中的值填入每個物件。 您可以針對加入 TableAdapter 的任何查詢,建立 GetData 方法,以便傳回已填入的資料表。

注意事項注意事項

根據預設,Visual Studio 會將 TableAdapter 查詢命名為 Fill 和 GetData,不過這些名稱可變更為任何有效的方法名稱。

下列範例將示範如何對資料表的資料列執行迴圈,並以資料填入物件:

如需完整的程式碼範例,請參閱逐步解說:連接至物件中的資料 (Windows Form)

Private Sub LoadCustomers()
    Dim customerData As NorthwindDataSet.CustomersDataTable =
        CustomersTableAdapter1.GetTop5Customers()

    Dim customerRow As NorthwindDataSet.CustomersRow

    For Each customerRow In customerData
        Dim currentCustomer As New Customer()
        With currentCustomer

            .CustomerID = customerRow.CustomerID
            .CompanyName = customerRow.CompanyName

            If Not customerRow.IsAddressNull Then
                .Address = customerRow.Address
            End If

            If Not customerRow.IsCityNull Then
                .City = customerRow.City
            End If

            If Not customerRow.IsContactNameNull Then
                .ContactName = customerRow.ContactName
            End If

            If Not customerRow.IsContactTitleNull Then
                .ContactTitle = customerRow.ContactTitle
            End If

            If Not customerRow.IsCountryNull Then
                .Country = customerRow.Country
            End If

            If Not customerRow.IsFaxNull Then
                .Fax = customerRow.Fax
            End If

            If Not customerRow.IsPhoneNull Then
                .Phone = customerRow.Phone
            End If

            If Not customerRow.IsPostalCodeNull Then
                .PostalCode = customerRow.PostalCode
            End If

            If Not customerRow.Is_RegionNull Then
                .Region = customerRow._Region
            End If

        End With

        LoadOrders(currentCustomer)
        CustomerBindingSource.Add(currentCustomer)
    Next
End Sub
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);
    }
}

建立物件的具型別集合

您可以建立物件的集合類別 (Collection Class),或是使用由 BindingSource 元件自動提供的具型別集合。

當您正在建立物件的自訂集合類別時,我們建議您從 BindingList<T> 繼承。 這個泛型類別會提供可管理集合的功能,以及引發事件的能力,以便傳送告知至 Windows Form 中的資料繫結基礎結構。

BindingSource 中自動產生的集合會使用其具型別集合的 BindingList<T>。 如果您的應用程式不需要其他功能,您就可以在 BindingSource 內維護集合。 如需詳細資訊,請參閱 BindingSource 類別的 List 屬性。

注意事項注意事項

如果您的集合將會需要未由 BindingList<T> 基底實作所提供的功能,則您應該建立自訂集合,以便可以在需要時加入至類別中。

下列程式碼將示範如何針對 Order 物件的強型別集合,建立類別:

''' <summary>
''' A collection of Orders
''' </summary>
Public Class Orders
    Inherits System.ComponentModel.BindingList(Of Order)

    ' Add any additional functionality required by your collection.

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

將物件加入至集合

您可以呼叫自訂集合類別或 BindingSource 的 Add 方法,將物件加入至集合中。

如需使用 BindingSource 加入至集合的範例,請參閱逐步解說:連接至物件中的資料 (Windows Form)中的 LoadCustomers 方法。

如需將物件加入至自訂集合的範例,請參閱逐步解說:連接至物件中的資料 (Windows Form)中的 LoadOrders 方法。

注意事項注意事項

當您從 BindingList<T> 繼承時,就會自動為您的自訂集合提供 Add 方法。

下列程式碼會示範如何將物件加入至 BindingSource 中的具型別集合:

Dim currentCustomer As New Customer()
CustomerBindingSource.Add(currentCustomer)
Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

下列程式碼會示範如何將物件加入至繼承自 BindingList<T> 的具型別集合:

注意事項注意事項

在這個範例中,Orders 集合是 Customer 物件的屬性。

Dim currentOrder As New Order()
currentCustomer.Orders.Add(currentOrder)
Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

從集合移除物件

您可以呼叫自訂集合類別或 BindingSource 的 Remove 或 RemoveAt 方法,從集合移除物件。

注意事項注意事項

當您從 BindingList<T> 繼承時,就會自動為您的自訂集合提供 Remove 和 RemoveAt 方法。

下列程式碼將示範如何使用 RemoveAt 方法,從 BindingSource 的具型別集合中找出並移除物件:

Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

將物件資料顯示給使用者

若要將物件的資料顯示給使用者,您可以使用資料來源組態精靈建立物件資料來源,然後從 [資料來源] 視窗將整個物件或個別的屬性拖曳至表單上。

如需如何建立物件資料來源的詳細資訊,請參閱 HOW TO:連接至物件中的資料

如需如何在 Windows Form 上顯示物件資料的詳細資訊,請參閱將控制項繫結至 Visual Studio 中的資料

修改物件中的資料

若要編輯資料繫結至 Windows Form 控制項之自訂物件中的資料,只要在繫結的控制項 (或直接在物件的屬性) 中編輯資料即可。 然後,資料繫結架構就會更新物件中的資料。

如果您的應用程式需要追蹤變更並將建議變更復原為原始值,您就必須在物件模型中實作這項功能。 如需資料表如何追蹤建議變更的範例,請參閱 DataRowStateHasChangesGetChanges

將物件的資料儲存回資料庫中

您可以將資料儲存回資料庫中,方法是將物件的值傳遞至 TableAdapter 的 DBDirect 方法。

Visual Studio 會建立可直接對資料庫執行的 DBDirect 方法。 這些方法不需要 DataSet 或 DataTable 物件。

TableAdapter DBDirect 方法

說明

TableAdapter.Insert

將新資料錄加入至資料庫,並讓您傳入個別的資料行值做為方法參數。

TableAdapter.Update

更新資料庫中的現有資料錄。 此 Update 方法會採用原始和新的資料行值做為方法參數。 原始值是用來找出原始資料錄,而新值則是用來更新該資料錄。

此外,TableAdapter.Update 方法也會用來將資料集的變更調整回資料庫中,方式是採用 DataSetDataTableDataRowDataRow 的陣列做為方法參數。

TableAdapter.Delete

根據傳入做為方法參數的原始資料行值,從資料庫刪除現有的資料錄。

若要儲存物件集合的資料,請在物件的集合中執行迴圈 (例如,使用 for-next 迴圈),然後使用 TableAdapter 的 DBDirect 方法,將每個物件的值傳送至資料庫中。

下列範例將示範如何使用 TableAdapter.Insert DBDirect 方法,直接將新的客戶加入至資料庫中:

Private Sub AddNewCustomer(ByVal currentCustomer As Customer)

    CustomersTableAdapter.Insert(
        currentCustomer.CustomerID,
        currentCustomer.CompanyName,
        currentCustomer.ContactName,
        currentCustomer.ContactTitle,
        currentCustomer.Address,
        currentCustomer.City,
        currentCustomer.Region,
        currentCustomer.PostalCode,
        currentCustomer.Country,
        currentCustomer.Phone,
        currentCustomer.Fax)
End Sub
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);
}

請參閱

工作

HOW TO:連接至物件中的資料

逐步解說:連接至物件中的資料 (Windows Form)

HOW TO:從物件中將資料儲存至資料庫

HOW TO:以 TableAdapter 直接存取資料庫

逐步解說:使用 TableAdapter DBDirect 方法儲存資料

概念

將控制項繫結至 Visual Studio 中的資料

其他資源

TableAdapter

儲存資料