共用方式為


ObjectDataSource.ObjectDisposing 事件

定義

在捨棄 TypeName 屬性識別的物件之前發生。

public:
 event System::Web::UI::WebControls::ObjectDataSourceDisposingEventHandler ^ ObjectDisposing;
public event System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler ObjectDisposing;
member this.ObjectDisposing : System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler 
Public Custom Event ObjectDisposing As ObjectDataSourceDisposingEventHandler 

事件類型

範例

本節包含兩個程式碼範例。 第一個程式代碼範例示範如何使用 ObjectDataSource 物件搭配商務物件和 GridView 控件來顯示資訊。 第二個程式代碼範例提供第一個程式代碼範例中使用的仲介層商務物件。

下列程式代碼範例示範如何使用 ObjectDataSource 控件搭配商務物件和 GridView 控件來顯示資訊。 您可以使用商務對象,針對網頁執行的每個數據作業,建立 (的時間或資源) 非常昂貴。 使用昂貴物件的其中一種方式可能是建立一次實例,然後快取它以進行後續作業,而不是針對每個數據作業建立和終結它。 此範例示範此模式。 您可以先處理 ObjectCreating 事件來檢查物件的快取,而且只有在尚未快取物件時,才建立它的實例。 然後,處理 ObjectDisposing 事件來快取商務物件以供日後使用,而不是終結它。 在此程式代碼範例中CancelEventArgs.CancelObjectDataSourceDisposingEventArgs,對象的 屬性會設定為 true ,以指示 ObjectDataSource 不要在 物件上呼叫 Dispose 方法。

<%@ Import namespace="Samples.AspNet.CS" %>
<%@ Page language="c#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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 xmlns="http://www.w3.org/1999/xhtml" >
  <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>
<%@ Import namespace="Samples.AspNet.VB" %>
<%@ Page language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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 xmlns="http://www.w3.org/1999/xhtml" >
  <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>

下列程式代碼範例提供上述程式代碼範例所使用的中間層商務物件。 程式代碼範例是由 類別所 EmployeeLogic 定義的基本商業物件所組成,這是封裝商業規則的具狀態類別。 如需完整的工作範例,您必須將此程式代碼編譯為連結庫,並從 ASP.NET 頁面 (.aspx 檔案) 使用這些類別。

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;
    }
  }
}
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
    
    
    Public Sub New(ByVal creationTime As DateTime) 
        _creationTime = creationTime
    
    End Sub
    
    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
End Namespace ' Samples.AspNet.VB

下列範例示範如何在搭配LINQ to SQL 類別使用ObjectDataSource控件時處理ObjectDisposing事件。

Public Sub ExampleObjectDisposing(ByVal sender As Object, _
        ByVal e As ObjectDataSourceDisposingEventArgs)
    e.Cancel = True
End Sub
public void ExampleObjectDisposing(object sender,
        ObjectDataSourceDisposingEventArgs e)
{
    e.Cancel = true;
}

備註

ObjectDisposing 捨棄商業對象的實例之前,一律會引發 事件。 如果商務對象實作 IDisposable 介面, Dispose 則會在引發這個事件之後呼叫 方法。

ObjectDisposing處理 事件,以在對象、設定屬性或執行物件特有的清除作業之前,呼叫物件上的其他方法。 對象的參考是由 ObjectInstance 物件所公開 ObjectDataSourceEventArgs 的 屬性所存取。

當您搭配 LINQ to SQL 類別使用 ObjectDataSource 控制項時,您必須取消在事件的處理程式 ObjectDisposing 中處置資料內容類別。 此步驟是必要的,因為 LINQ to SQL 支援延後執行,而 ObjectDataSource 控件則會嘗試在 Select 作業之後處置數據內容。

如需如何處理事件的詳細資訊,請參閱 處理和引發事件

適用於

另請參閱