子どものコントロールからデータを取得すると、プログラムでロードされます
-
27-09-2019 - |
質問
データオブジェクトを操作するための2つのコントロールを作成しました。1視聴用、もう1つは編集用です。
1ページで「ビュー」をロードします UserControl
この方法でデータを渡す:
ViewControl control = (ViewControl)LoadControl("ViewControl.ascx");
control.dataToView = dataObject;
this.container.Controls.Add(control);
それはすべて問題あり、コントロールの内部では、そのデータをつかんで表示できます。
今、私は編集のための同様のアプローチに従おうとしています。私はこれに対して異なるユーザーコントロールを持っています(編集用のテキストボックスをいくつか用意しています)、私はビューのために行ったのと同じように元のデータを渡します:
EditControl control = (EditControl)LoadControl("EditControl.ascx");
control.dataToEdit = dataObject;
this.container.Controls.Add(control);
これも正常に動作します。
問題は、このデータに到達することです。ユーザーがボタンをクリックすると、編集されたデータを取得し、それを使用する必要があります。起こっているのは、コントロールがプログラムで追加されているため、ユーザーが変更したデータはどこにもアクセスできないように見えるということです。
これの解決策はありますか?それとも、物事を分離し、おそらく再利用できないようにしようとするこの方法は不可能ですか?
前もって感謝します。
解決 3
これが私の解決策です:
ページでは、プログラムでロードされるコントロールへの参照を保持します。コントロールでは、ユーザーが入力したデータでオブジェクトを返すgetData()メソッドを作成しました。ユーザーがフォームを送信すると、ページはコントロール上のgetData()メソッドを呼び出して、ユーザーが入力したデータにアクセスします。
他のヒント
ページのコードビハインドの変数としてコントロールを参照してください。すなわち
private EditControl control;
protected void Page_Init(object sender, EventArgs e)
{
control = (EditControl)LoadControl("EditControl.ascx");
control.dataToEdit = dataObject;
this.container.Controls.Add(control);
}
protected void Button_Click(object sender, EventArgs e)
{
var dataToEdit = control.dataToEdit;
}
ページのライフサイクルの右側にコントロールを作成している限り(初期化)、 ViewState
維持されます。 Datatoeditはただのものだと思います TextBox
か何か?
動的に作成されたコントロールを追加する必要があります Init
また PreInit
ページ上のイベント。
コントロール状態はまだロードされていないため、ここでそれをしなければなりません。ページがページのライフサイクルの早い段階で既に入力されたコントロールページの値がすでに入力されているため、コントロールを空にした後にコントロールを追加する場合。
ページライフサイクルの詳細 ここ