次の方法で共有


ObjectDataSource.UpdateMethod プロパティ

定義

ObjectDataSource コントロールがデータを更新するために呼び出すメソッドまたは関数の名前を取得または設定します。

public:
 property System::String ^ UpdateMethod { System::String ^ get(); void set(System::String ^ value); };
public string UpdateMethod { get; set; }
member this.UpdateMethod : string with get, set
Public Property UpdateMethod As String

プロパティ値

データを更新するために ObjectDataSource が使用するメソッドまたは関数の名前を表す文字列。 既定値は空の文字列です。

次の 3 つの例は、Web ページ、分離コード ページ クラス、およびユーザーが Northwind データベースの Employees テーブルのレコードを取得および更新できるようにするデータ アクセス クラスを示しています。

最初の例は、コントロールとコントロールの 2 つの ObjectDataSource コントロールを DropDownList 含む Web ページを DetailsView 示しています。 最初 ObjectDataSource のコントロールとコントロールは DropDownList 、データベースから従業員名を取得および表示するために使用されます。 2 番目 ObjectDataSourceDetailsView コントロールとコントロールは、ユーザーが選択した従業員レコードからデータを取得、表示、変更するために使用されます。

<form id="Form1" method="post" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>
<form id="form1" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>

2 番目の例は、 イベントと Updating イベントのハンドラーをSelected示しています。 イベント ハンドラーは Selected 、Employee テーブルから取得されたデータを含むオブジェクトをシリアル化します。 シリアル化されたオブジェクトは、ビューステートに格納されます。 イベント ハンドラーは Updating 、更新されるデータ レコードの元のデータを含むビュー ステートのオブジェクトを逆シリアル化します。 元のデータを含む オブジェクトは、パラメーターとして Update メソッドに渡されます。 データが別のプロセスによって変更されたかどうかを確認するために使用できるように、元のデータをデータベースに渡す必要があります。

public void EmployeeUpdating(object source, ObjectDataSourceMethodEventArgs e)
{
    DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));

    String xmlData = ViewState["OriginalEmployee"].ToString();
    XmlReader reader = XmlReader.Create(new StringReader(xmlData));
    Employee originalEmployee = (Employee)dcs.ReadObject(reader);
    reader.Close();

    e.InputParameters.Add("originalEmployee", originalEmployee);
}

public void EmployeeSelected(object source, ObjectDataSourceStatusEventArgs e)
{
    if (e.ReturnValue != null)
    {
        DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));
        StringBuilder sb = new StringBuilder();
        XmlWriter writer = XmlWriter.Create(sb);
        dcs.WriteObject(writer, e.ReturnValue);
        writer.Close();

        ViewState["OriginalEmployee"] = sb.ToString();
    }
}
Public Sub EmployeeUpdating(ByVal source As Object, ByVal e As ObjectDataSourceMethodEventArgs)
    Dim dcs As New DataContractSerializer(GetType(Employee))
    Dim xmlData As String
    Dim reader As XmlReader
    Dim originalEmployee As Employee

    xmlData = ViewState("OriginalEmployee").ToString()
    reader = XmlReader.Create(New StringReader(xmlData))
    originalEmployee = CType(dcs.ReadObject(reader), Employee)
    reader.Close()

    e.InputParameters.Add("originalEmployee", originalEmployee)
End Sub

Public Sub EmployeeSelected(ByVal source As Object, ByVal e As ObjectDataSourceStatusEventArgs)
    If e.ReturnValue IsNot Nothing Then
        Dim dcs As New DataContractSerializer(GetType(Employee))
        Dim sb As New StringBuilder()
        Dim writer As XmlWriter
        writer = XmlWriter.Create(sb)
        dcs.WriteObject(writer, e.ReturnValue)
        writer.Close()

        ViewState("OriginalEmployee") = sb.ToString()
    End If
End Sub

3 番目の例は、Northwind データベースと対話するデータ アクセス クラスを示しています。 クラスは LINQ を使用して Employees テーブルのクエリと更新を行います。 この例では、Northwind データベースと Employees テーブルを表す LINQ to SQL クラスが必要です。 詳細については、「 方法: Web プロジェクトで LINQ to SQL クラスを作成する」を参照してください。

public class EmployeeLogic
{
    public static Array GetFullNamesAndIDs()
    {
        NorthwindDataContext ndc = new NorthwindDataContext();

        var employeeQuery =
            from e in ndc.Employees
            orderby e.LastName
            select new { FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID };

        return employeeQuery.ToArray();
    }

    public static Employee GetEmployee(int empID)
    {
        if (empID < 0)
        {
            return null;
        }
        else
        {
            NorthwindDataContext ndc = new NorthwindDataContext();
            var employeeQuery =
                from e in ndc.Employees
                where e.EmployeeID == empID
                select e;

            return employeeQuery.Single();
        }
    }
 
    public static void UpdateEmployeeAddress(Employee originalEmployee, string address, string city, string postalcode)
    {
        NorthwindDataContext ndc = new NorthwindDataContext();
        ndc.Employees.Attach(originalEmployee, false);
        originalEmployee.Address = address;
        originalEmployee.City = city;
        originalEmployee.PostalCode = postalcode;
        ndc.SubmitChanges();
    }
}
Public Class EmployeeLogic
    Public Shared Function GetFullNamesAndIDs() As Array
        Dim ndc As New NorthwindDataContext()

        Dim employeeQuery = _
            From e In ndc.Employees _
            Order By e.LastName _
            Select FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID

        Return employeeQuery.ToArray()
    End Function

    Public Shared Function GetEmployee(ByVal empID As Integer) As Employee

        If (empID < 0) Then
            Return Nothing
        Else
            Dim ndc As New NorthwindDataContext()
            Dim employeeQuery = _
                From e In ndc.Employees _
                Where e.EmployeeID = empID _
                Select e

            Return employeeQuery.Single()
        End If
    End Function

    Public Shared Sub UpdateEmployeeAddress(ByVal originalEmployee As Employee, ByVal address As String, ByVal city As String, ByVal postalcode As String)

        Dim ndc As New NorthwindDataContext()
        ndc.Employees.Attach(originalEmployee, False)
        originalEmployee.Address = address
        originalEmployee.City = city
        originalEmployee.PostalCode = postalcode
        ndc.SubmitChanges()
    End Sub
End Class

注釈

コントロールは ObjectDataSource 、 プロパティによって UpdateMethod 識別されるメソッドが、バッチではなく一度に 1 つずつ更新を実行することを前提としています。

プロパティは UpdateMethod 、コントロールに UpdateMethod 関連付けられている オブジェクトの ObjectDataSourceView プロパティにデリゲートします ObjectDataSource

コレクション内UpdateParametersのコントロールに対して構成されたパラメーター名がObjectDataSource、select メソッドによって返される列名と一致していることを確認します。

オブジェクトの有効期間

プロパティによって UpdateMethod 識別されるメソッドは、インスタンス メソッドまたは static (Shared Visual Basic の場合は ) メソッドです。 インスタンス メソッドの場合、 プロパティで UpdateMethod 指定されたメソッドが呼び出されるたびにビジネス オブジェクトが作成され、破棄されます。 プロパティで指定されたメソッドが ObjectCreated 呼び出される前に、 イベントと ObjectCreating イベントを処理してビジネス オブジェクトを UpdateMethod 操作できます。 プロパティで指定されたメソッドが ObjectDisposing 呼び出された後に発生するイベントを UpdateMethod 処理することもできます。 ビジネス オブジェクトが インターフェイスを実装している IDisposable 場合、オブジェクトが Dispose 破棄される前に メソッドが呼び出されます。 メソッドが static (Shared Visual Basic の場合) の場合、ビジネス オブジェクトは作成されません。、ObjectCreating、および ObjectDisposing イベントはObjectCreated処理できません。

パラメーターのマージ

パラメーターは、次の UpdateParameters 3 つのソースからコレクションに追加されます。

  • 実行時に、データ バインド コントロールから。

  • 要素から UpdateParameters 、宣言的に。

  • プログラムによって Updating 、イベント ハンドラーから。

最初に、データ バインド コントロールから生成されるすべてのパラメーターがコレクションに UpdateParameters 追加されます。 たとえば、 コントロールが 列 NameNumberを持つコントロールにGridViewバインドされている場合ObjectDataSource、 および のNameNumberパラメーターがコレクションに追加されます。 パラメーターの正確な名前は、 プロパティによって OldValuesParameterFormatString 異なります。 これらのパラメーターのデータ型は です string。 次に、 要素に一覧表示されているパラメーターが UpdateParameters 追加されます。 要素内のUpdateParametersパラメーターが、コレクション内に既に存在するパラメーターと同じ名前で見つかった場合、既存のパラメーターは、 要素でUpdateParametersUpdateParameters指定されているパラメーターと一致するように変更されます。 通常、これは パラメーター内のデータの型を変更するために使用されます。 最後に、メソッドが実行される前Updateに発生するイベントにパラメーターをUpdatingプログラムで追加および削除できます。 メソッドは、パラメーターがマージされた後に解決されます。 メソッドの解決方法については、次のセクションで説明します。

重要

クライアントから受け取るパラメーター値を検証する必要があります。 ランタイムは、パラメーター値を プロパティに置き UpdateMethod 換えるだけです。

メソッドの解決

メソッドが Update 呼び出されると、データ バインド コントロールのデータ フィールド、要素で UpdateParameters 宣言的に作成されたパラメーター、およびイベント ハンドラーに Updating 追加されたパラメーターがすべてマージされます。 (詳細については、前のセクションを参照してください)。その後、コントロールは ObjectDataSource 呼び出すメソッドの検索を試みます。 最初に、 プロパティで指定された名前の 1 つ以上のメソッドを UpdateMethod 検索します。 一致するものが見つからない場合は、 InvalidOperationException 例外がスローされます。 一致するものが見つかった場合は、一致するパラメーター名を検索します。 たとえば、 プロパティで指定された型に という名前の TypeName 2 つのメソッドがあるとします UpdateARecord。 1 つは UpdateARecord 1 つのパラメーター で、 IDもう UpdateARecord 1 つは と の 2 つのパラメーター NameNumberを持っています。 コレクションに という名前IDUpdateParametersパラメーターが 1 つしかない場合は、 UpdateARecord パラメーターのみをID持つ メソッドが呼び出されます。 パラメーターの型は、メソッドの解決ではチェックされません。 パラメーターの順序は関係ありません。

プロパティが DataObjectTypeName 設定されている場合、メソッドは別の方法で解決されます。 は ObjectDataSource 、 プロパティで指定された型の 1 つのパラメーターを UpdateMethod 受け取る プロパティで指定された名前のメソッドを DataObjectTypeName 検索します。 この場合、パラメーターの名前は重要ではありません。

適用対象

こちらもご覧ください