編集サポートの有効化
AutoGenerateEditButton属性を『true』に設定すると、GridViewのインライン行編集が可能になります。GridViewは、各行にEditリンクを表示し、それをユーザーがクリックすればその行を編集モードに変えられます。
次に、更新メソッドを呼び出すように、GridViewを構成します(後でコードビハインドに追加します)。これは、UpdateMethod属性にメソッド名を設定すればできます。今回のケースだと『UpdateProduct』になります。GridViewは、現在以下のようになっています。
<asp:GridView ID="productsGrid" runat="server" DataKeyNames="ProductID"
ModelType="ModelBindingPart3.Product"
AllowPaging="true" AllowSorting="true"
AutoGenerateColumns="false" AutoGenerateEditButton="true"
SelectMethod="GetProducts" UpdateMethod="UpdateProduct">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ID" />
<asp:BoundField DataField="ProductName" HeaderText="Name" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" SortExpression="UnitPrice" />
<asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock" SortExpression="UnitsInStock" />
</Columns>
</asp:GridView>
ページを実行すると、レコードの隣にある『Edit』リンクをクリックすれば、編集モードにできます。
コードビハインドのUpdateProductメソッドを実装する必要があります。これを行う方法は、2通りあります。
方法1
最初の方法は、Webフォームのモデルバインディングシステムにより、Productインスタンスを更新メソッドに引き渡させることで、EFコードファーストのコンテキストを添付させ、データベースにその値を適用できるようにします。
public void UpdateProduct(Product product)
{
// 'product' was implicitly model bound using data-control values
_db.Entry(product).State = System.Data.EntityState.Modified;
_db.SaveChanges();
}
上記のメソッドは、GridViewがバインドする1つのタイプパラメータである『Product』タイプをとります。UpdateProduct メソッドがモデルバインディングシステムから呼び出されたときは暗黙的にProductのインスタンスを生成して、データコントロール(GridView)からメンバーに値をバインドしようとします。その後、UpdateProductメソッドは、EF コードファーストに、Productオブジェクトが修正されたことを伝えます。そうすると、最終的に変更を保存する前に、オブジェクトに変更された印が付けられます。
方法2
この方法は単純なケースに限られるのですが、通常だとデータコントロールがデータオブジェクトのすべてのメンバーに対して値を提供できません。それは、それらの値がページに描画されない、または他のオブジェクトとの関係を表しているからです。
public void UpdateProduct(int productId)
{
var product = _db.Products.Find(productId);
// Explicitly model bind data-control values onto 'product'
TryUpdateModel(product);
_db.SaveChanges();
}
今回、Webフォームのモデルバインディングシステムは、データコントロールのDataKeysコレクションからproductIdパラメータを紐づけます(これは暗黙的に行われ、値プロバイダー属性は何も必要ありません)。その後、データベースからその製品を取得して、TryUpdateModelを呼び出して、値をデータコントロールからオブジェクトへモデルバインドします。それが終了すると、データベースに変更を保存します。

