SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

オブジェクトバインディングに関するヒントとテクニック

.NET Framework 2.0で強化されたデータバインディング機能

ビジネスオブジェクトに値を割り当てる

 この時点でアプリケーションを実行しても、何も表示されません。コントロールはプロパティにバインドされていますが、プロパティに値がないのです。そこで、ビジネスオブジェクトに値を割り当てることが、オブジェクトバインディングの次の大きなステップになります。

 データを取得してビジネスオブジェクトに割り当てるには、さまざまな方法があります。例えば、DataSetまたはDataTableを使用する方法や、Webサービスを使って必要なデータを取得する方法があります。また、TableAdaptersを使って、プロパティをデータベースフィールドにバインドする方法もあります。

 話を簡単にするために、ビジネスオブジェクトのプライベートなRetrieveメソッドを使って、必要なデータを取得することにします。実際には、ADO.NETを使ってコード内でDataTableを作成します。この方法の場合、オブジェクトバインディングを試みるのに、データベース、ストアドプロシージャ、またはWebサービスを作成する必要がありません。リスト1は、VBコードのRetrieveメソッドです。リスト2は、C#のRetrieveメソッドです。

リスト1 テスト用の一時的な^^Retrieve^^メソッド(VB)
Private Function Retrieve(ByVal CustomerID As Int32) As DataRow
Dim dt As New DataTable
   ' Define the columns
   dt.Columns.Add("CustomerID")
   dt.Columns.Add("LastName")
   dt.Columns.Add("FirstName")
   Select Case CustomerID
   Case 1
      dt.Rows.Add(1, "Einstein", "Albert")
   Case 2
      dt.Rows.Add(2, "Curie", "Marie")
   Case 3
      dt.Rows.Add(3, "Brahe", "Tycho")
   Case 4
      dt.Rows.Add(4, "Faraday", "Michael")
   End Select
   Return dt.Rows(0)
End Function
リスト2 テスト用の一時的な^^Retrieve^^メソッド(C#)
private DataRow Retrieve(Int32 CustomerID)
{
   DataTable dt = new DataTable();
   // Define the columns
   dt.Columns.Add("CustomerID");
   dt.Columns.Add("LastName");
   dt.Columns.Add("FirstName");
   switch (CustomerID)
   {
      case 1:
         dt.Rows.Add(1, "Einstein", "Albert");
         break;
      case 2:
         dt.Rows.Add(2, "Curie", "Marie");
         break;
      case 3:
         dt.Rows.Add(3, "Brahe", "Tycho");
         break;
      case 4:
         dt.Rows.Add(4, "Faraday", "Michael");
         break;
   }
   return dt.Rows[0];
}

 ベストプラクティスでは、Factoryパターンを使ってビジネスオブジェクトを作成し、これに取得データを割り当てます。Factoryパターンを実装するには、さまざまな方法があります。今回の例では、次に示すように、Factoryパターンの実装によってコンストラクタをプライベートにし(これで他のコードはオブジェクトを作成できなくなります)、インスタンスの作成と値の割り当てを行う静的な(共有の)Createメソッドを定義します。

VBの場合
Private Sub New()
' Don't allow creation of this object
End Sub
Public Shared Function Create(ByVal CustomerID _
   As Int32) As Customer
   ' Create the customer
   Dim oCustomer As New Customer
   ' Retrieve the data for this customer
   Dim dr As DataRow
   dr = oCustomer.Retrieve(CustomerID)
   ' Populate the business object
   oCustomer.Populate(dr)
   Return oCustomer
End Function
C#の場合
private Customer()
{
   // Don't allow creation of this object
}
public static Customer Create(Int32 CustomerID)
{
   // Create the customer
   Customer oCustomer = new Customer();
   // Retrieve the data for this customer
   DataRow dr =oCustomer.Retrieve(CustomerID);
   // Populate the business object
   oCustomer.Populate(dr);
   return oCustomer;
}

 実際にビジネスオブジェクトへの値の割り当てを行うメソッドは、次のようになります。

VBの場合
Private Sub Populate(ByVal CustomerDataRow As _
   DataRow)
   With CustomerDataRow
      Me.LastName = .Item("LastName").ToString
      Me.FirstName = .Item("FirstName").ToString
      Me.CustomerID = .Item("CustomerID").ToString
   End With
End Sub
C#の場合
private void Populate(DataRow CustomerDataRow)
{
   this.LastName =
      CustomerDataRow["LastName"].ToString();
   this.FirstName =
      CustomerDataRow["FirstName"].ToString();
   this.CustomerID =
   Convert.ToInt32(CustomerDataRow["CustomerID"]);
}

 ビジネスオブジェクトにプロパティを追加するたびに、Populateメソッドのコードを拡張する必要があります。型指定されていないDataSet、DataReader、または他の方法を使用するのではなく、TableAdapterまたは型指定されたDataSetを使ってデータを取得する場合は、引用符で囲まれた文字列の列名の代わりに、自動的に生成された厳密に型指定された名前を使って、データ列を参照します。

 オブジェクトバインディングを完成させるには、フォームのLoadイベントに、オブジェクトの作成とバインドを行うコードを追加します。具体的には、次のようにCreateメソッドを呼び出してオブジェクトのインスタンスを作成し、そのインスタンスにCustomerBindingSourceを代入してバインドします。

VBの場合
Private Sub CustomerWin_Load(ByVal sender As _
   Object, ByVal e As System.EventArgs) _
   Handles Me.Load
   Dim CustomerInstance As Customer
      CustomerInstance = Customer.Create(1)
      CustomerBindingSource.DataSource =
         CustomerInstance
End Sub
C#の場合
private void CustomerWin_Load(object sender,
   EventArgs e)
{
   Customer CustomerInstance =
      Customer.Create(1);
   customerBindingSource.DataSource =
      CustomerInstance;
}

 この時点で、アプリケーションを実行できます。問題がなければ、フォームが表示され、そのフォーム上のコントロールにプロパティ値がテキストとして表示されます。

次のページ
データ管理

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Deborah Kurata(Deborah Kurata)

ビジネスの構想をMicrosoft .NETテクノロジで実現することに力を注ぐコンサルティング会社InStep Technologies Inc.の共同設立者。優れた.NETアプリケーションの設計、デザイン、開発に15年以上従事。『Doing Objects in Visual Basic 6.0』...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/383 2006/08/22 15:46

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー