ObjectDataSource.ObjectCreating イベント
アセンブリ: System.Web (system.web.dll 内)

Dim instance As ObjectDataSource Dim handler As ObjectDataSourceObjectEventHandler AddHandler instance.ObjectCreating, handler
public: event ObjectDataSourceObjectEventHandler^ ObjectCreating { void add (ObjectDataSourceObjectEventHandler^ value); void remove (ObjectDataSourceObjectEventHandler^ value); }

データ操作を実行するために識別されたメソッドが static (Visual Basic では Shared) の場合は、ObjectCreating イベントと ObjectCreated イベントが発生することはありません。
ObjectDataSource コントロールは、ビジネス オブジェクトの既定のコンストラクタを自動的に呼び出し、リフレクションを使用してそのオブジェクトのインスタンスを作成します。ObjectCreating イベントを処理して、別のコンストラクタを明示的に呼び出し、その結果作成されたオブジェクトのインスタンスに、関連付けられた ObjectDataSourceEventArgs オブジェクトの ObjectInstance プロパティを設定します。

このセクションには、2 つのコード例が含まれています。1 つ目のコード例では、ビジネス オブジェクトおよび GridView コントロールで、ObjectDataSource オブジェクトを使用して情報を表示する方法を示します。2 つ目のコード例では、1 つ目のコード例で使用されている中間層ビジネス オブジェクトを示します。
ビジネス オブジェクトおよび GridView コントロールで、ObjectDataSource コントロールを使用して情報を表示する方法を次のコード例に示します。Web ページで実行される各データ操作に、作成時の負荷が大きい (作成に時間がかかる、リソースの消費が激しいなど) ビジネス オブジェクトを使用している場合があります。負荷のかかるオブジェクトを使用する場合は、データを操作するたびにインスタンス化と破棄を繰り返すのではなく、インスタンス化したオブジェクトを後続の処理で再利用できるようにキャッシュに格納しておくことをお勧めします。
![]() |
---|
実働アプリケーションでは、同じインスタンスを使用して複数の要求が同時に終了する場合があります。したがって、スレッド セーフな方法でオブジェクトを実装する必要があります。 |
このコード例では、このパターンを示します。ObjectCreating イベントを処理することで、まずキャッシュにオブジェクトが存在するかどうかを調べ、存在しない場合にのみ、インスタンスを作成できます。次に、ObjectDisposing イベントを処理し、ビジネス オブジェクトを破棄せずに、キャッシュに保存して後で使用できるようにします。このコード例では、ObjectDataSource がオブジェクトに対して Dispose メソッドを呼び出さないように、ObjectDataSourceDisposingEventArgs オブジェクトの CancelEventArgs.Cancel プロパティが true に設定されています。
<%@ Import namespace="Samples.AspNet.VB" %> <%@ Page language="vb" %> <Script runat="server"> ' Instead of creating and destroying the business object each time, the ' business object is cached in the ASP.NET Cache. Sub GetEmployeeLogic(sender As Object, e As ObjectDataSourceEventArgs) ' First check to see if an instance of this object already exists in the Cache. Dim cachedLogic As EmployeeLogic cachedLogic = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic) If (cachedLogic Is Nothing) Then cachedLogic = New EmployeeLogic End If e.ObjectInstance = cachedLogic End Sub ' GetEmployeeLogic Sub ReturnEmployeeLogic(sender As Object, e As ObjectDataSourceDisposingEventArgs) ' Get the instance of the business object that the ObjectDataSource is working with. Dim cachedLogic As EmployeeLogic cachedLogic = CType( e.ObjectInstance, EmployeeLogic) ' Test to determine whether the object already exists in the cache. Dim temp As EmployeeLogic temp = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic) If (temp Is Nothing) Then ' If it does not yet exist in the Cache, add it. Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic) End If ' Cancel the event, so that the object will ' not be Disposed if it implements IDisposable. e.Cancel = True End Sub ' ReturnEmployeeLogic </Script> <html> <head> <title>ObjectDataSource - VB Example</title> </head> <body> <form id="Form1" method="post" runat="server"> <asp:gridview id="GridView1" runat="server" datasourceid="ObjectDataSource1"> </asp:gridview> <asp:objectdatasource id="ObjectDataSource1" runat="server" selectmethod="GetCreateTime" typename="Samples.AspNet.VB.EmployeeLogic" onobjectcreating="GetEmployeeLogic" onobjectdisposing="ReturnEmployeeLogic" > </asp:objectdatasource> </form> </body> </html>
<%@ Import namespace="Samples.AspNet.CS" %> <%@ Page language="c#" %> <Script runat="server"> // Instead of creating and destroying the business object each time, the // business object is cached in the ASP.NET Cache. private void GetEmployeeLogic(object sender, ObjectDataSourceEventArgs e) { // First check to see if an instance of this object already exists in the Cache. EmployeeLogic cachedLogic; cachedLogic = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic; if (null == cachedLogic) { cachedLogic = new EmployeeLogic(); } e.ObjectInstance = cachedLogic; } private void ReturnEmployeeLogic(object sender, ObjectDataSourceDisposingEventArgs e) { // Get the instance of the business object that the ObjectDataSource is working with. EmployeeLogic cachedLogic = e.ObjectInstance as EmployeeLogic; // Test to determine whether the object already exists in the cache. EmployeeLogic temp = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic; if (null == temp) { // If it does not yet exist in the Cache, add it. Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic); } // Cancel the event, so that the object will // not be Disposed if it implements IDisposable. e.Cancel = true; } </Script> <html> <head> <title>ObjectDataSource - C# Example</title> </head> <body> <form id="Form1" method="post" runat="server"> <asp:gridview id="GridView1" runat="server" datasourceid="ObjectDataSource1"> </asp:gridview> <asp:objectdatasource id="ObjectDataSource1" runat="server" selectmethod="GetCreateTime" typename="Samples.AspNet.CS.EmployeeLogic" onobjectcreating="GetEmployeeLogic" onobjectdisposing="ReturnEmployeeLogic" > </asp:objectdatasource> </form> </body> </html>
前のコード例で使用した中間層ビジネス オブジェクトの例を次のコード例に示します。このコード例は、状態を維持しビジネス ロジックをカプセル化する EmployeeLogic クラスによって定義される、基本ビジネス オブジェクトで構成されます。実際に動作させるためには、このコードをライブラリとしてコンパイルし、これらのクラスを ASP.NET ページ (.aspx ファイル) から使用する必要があります。
Imports System Imports System.Collections Imports System.Web.UI Imports System.Web.UI.WebControls Namespace Samples.AspNet.VB Public Class EmployeeLogic Public Sub New() MyClass.New(DateTime.Now) End Sub 'New Public Sub New(ByVal creationTime As DateTime) _creationTime = creationTime End Sub 'New Private _creationTime As DateTime ' Returns a collection of NorthwindEmployee objects. Public Function GetCreateTime() As ICollection Dim al As New ArrayList() ' Returns creation time for this example. al.Add("The business object that you are using was created at " + _creationTime) Return al End Function 'GetCreateTime End Class 'EmployeeLogic End Namespace ' Samples.AspNet.VB
namespace Samples.AspNet.CS { using System; using System.Collections; using System.Web.UI; using System.Web.UI.WebControls; // // EmployeeLogic is a stateless business object that encapsulates // the operations you can perform on a NorthwindEmployee object. // public class EmployeeLogic { public EmployeeLogic () : this(DateTime.Now) { } public EmployeeLogic (DateTime creationTime) { _creationTime = creationTime; } private DateTime _creationTime; // Returns a collection of NorthwindEmployee objects. public ICollection GetCreateTime () { ArrayList al = new ArrayList(); // Returns creation time for this example. al.Add("The business object that you are using was created at " + _creationTime); return al; } } }

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- ObjectDataSource.ObjectCreating イベントのページへのリンク