GridView から選択された単一の製品の詳細を編集できるようにすることを目的とした、LinqDataSource にバインドされた FormView があります。LDS には、GridView コントロール (つまり、ControlParameter) を指すように設定された Where パラメーターがあります。
<asp:LinqDataSource ID="ldsProduct" runat="server" OnContextCreating="LinqDataSource_ContextCreating"
EnableDelete="True" EnableInsert="True" EnableUpdate="True" TableName="Products"
Where="ProductID=@ProductID" OnSelecting="ldsProduct_Selecting" OnUpdating="ldsProduct_Updating"
OnInserted="ldsProduct_Inserted" OnUpdated="ldsProduct_Updated" OnDeleted="ldsProduct_Deleted">
<WhereParameters>
<asp:ControlParameter Name="ProductID" ControlID="gvProducts" />
</WhereParameters>
FormViewには、GridView で選択した製品レコードが表示されます。ただし、[更新] をクリックしても、データベースに対して更新は実行されません。
これは私が見たものです:
- FormView の ItemCommand ハンドラーで、Update コマンドが発生します。
- 次に、LDS の Updating イベントが発生しますが、e.NewObject を見ると、Product オブジェクトが添付されていますが、ProductID が (正しい値に) 設定されているだけで、他のすべてのプロパティは設定されていません。これが、更新がデータベースにヒットしない理由であることは間違いありません。
FormView を編集モードに明示的に設定し、FormView の ItemCommand ハンドラーでデータバインドしようとしましたが、違いはありません。
fvProduct.ChangeMode(FormViewMode.Edit)
fvProduct.DataBind()
データを表示しているときに FormView がどのように Product オブジェクトに明確にバインドされているのかわかりませんが、Update コマンドを実行するとそれが失われます。
ところで、私は DataContext にカスタム コンストラクターを使用していますが、OnContextCreated を通常の ContextTypeName に置き換えると、やはり問題が発生します。