FormViewでバインドされたオブジェクトを手動で変更するにはどうすればよいですか?
-
06-07-2019 - |
質問
ObjectDataSourceでFormViewを使用しています。保存ボタンをクリックすると、ObjectDataSources Updateメソッドに設定される前に、データバインドされたオブジェクトを変更したいと思います。
FormViewのUpdatingイベントとObject Data SourceのUpdatingイベントを試しましたが、データバインドオブジェクトにアクセスする方法がわかりません。これらのイベントでは、FormView.DataItemはnullです。
つまり、ObjectItem UpdateMethodに渡される前にDataItemをインターセプトおよび変更したいと思います。
これを行う理由についてもう少し詳しく説明するために、ビルドイン機能ではデータバインドできないフォーム上の値がいくつかあります。コントロールの1つはチェックボックスリストです。 DataBindingイベントを使用してチェックを設定しますが、フォーム値を反映するようにオブジェクトを更新する方法も必要です。同様の状況の他のコントロールもあります。
解決
独自のビジネスオブジェクト(別名ObjectDataSource)を作成し、元のObjectDataSourceオブジェクトをラップするだけではどうですか?その後、必要なものをインターセプトし、元のObjectDataSourceオブジェクトのSaveメソッドへの途中で変更できます。
他のヒント
これは古い質問ですが、同じ問題があり、ボブが探していると思う答えを見つけました。
解決策は、WebフォームでObjectDataSource Updatingイベントを使用することです。 Updatingイベントには、ObjectDataSourceMethodEventArgsオブジェクトがパラメーターとして含まれています。 ObjectDataSourceMethodEventArgsクラスには" InputParameters"という名前のプロパティが含まれており、これを使用してデータオブジェクトにアクセスし、更新が発生する前に内容を変更できます。最初にInputParametersオブジェクトをOrderedDictionary型に変換する必要があります(完全な名前空間はSystem.Collections.Specialized.OrderedDictionaryです)
次のようになります:
protected void myObjectDataSource_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
OrderedDictionary parameters = (OrderedDictionary)e.InputParameters;
MyDataObject updatedData = (MyDataObject)parameters[0];
DropDownList myDropDown = (DropDownList)FormView1.FindControl("myDropDown")
updatedData.SomeDataValue = myDropDown.SelectedValue;
}
DataItemは、DataBindingの場合にのみ使用可能です。
その後、データはFormView内のコントロールにバインドされます。
更新する前に、バインドされた値にアクセスするにはmyFormView.FindControl(string id)を使用します。
双方向のデータバインディングが機能しない場合は、オブジェクトをインスタンス化し、プロパティを手動で入力してから、変更を更新またはコミットする必要があります。
Updateイベントにいるため、データバインディングがまだ発生していないため、FormView.DataItemはnullです。目的のデータを含むフォームコントロールを介してデータにアクセスする必要があります。
関連するコントロールのOnDataBindingイベント中にデータ変更を適用してみてください。