Visual Studio 中的物件繫結
Visual Studio 提供了一些設計階段工具,可將自訂物件 (而非其他資料來源如實體、資料集和服務) 當做應用程式中的資料來源使用。
物件需求
要讓自訂物件與 Visual Studio 中的資料設計工具搭配使用,唯一的要求就是物件至少需要有一個公用屬性。
自訂物件通常並不需要特定的介面、建構函式或屬性,即可做為應用程式的資料來源。 不過,如果您要從 [資料來源] 視窗將物件拖曳至設計介面以建立資料繫結控制項,而且如果此物件實作 ITypedList 或 IListSource 介面,物件必須有預設建構函式 (即無參數的建構函式)。 否則,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 控制項之自訂物件中的資料,只要在繫結的控制項 (或直接在物件的屬性) 中編輯資料即可。 然後,資料繫結架構就會更新物件中的資料。
如果您的應用程式需要追蹤變更並將建議變更復原為原始值,您就必須在物件模型中實作這項功能。 如需資料表如何追蹤建議變更的範例,請參閱 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 方法,將每個物件的值傳送至資料庫中。
下列範例將示範如何使用 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);
}
請參閱
工作
逐步解說:使用 TableAdapter DBDirect 方法儲存資料