2012-03-05 12 views
1

私は動的に読み込んでいるユーザーコントロールに基本的なTextBoxを持っています。私はこのTextBoxに値をプッシュする方法を考え出しました。私が実行している問題は、このTextBoxから入力された値を取得できないということです。動的に読み込まれたユーザーコントロールからポスト値にアクセスする方法

動的に読み込まれたコントロールに変数を渡すためのクラスを作成する必要がありました。私はそれをPBUserControlと呼んだ。

public class PBUserControl : UserControl 
{ 
    public IList<NVP> NameValuePairs { get { return _NameValuePairs; } } 

    public class NVP 
    { 
     public NVP() { } 
     public NVP(string name, string value) 
     { 
      this.Name = name; 
      this.Value = value; 
     } 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 
} 

これは、ユーザーコントロールにデータを送信するためにはうまくいくようです。

マイ動的にロードされたユーザーコントロール:

public partial class PageAddEdit : PageBase 
{ 
    private PBUserControl _PBUserControl; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     // Must always desigante the control here else it dissapears. 
     Control TemplateUserControl = LoadControl("~/Administrator/PageBuilder/Templates/Basic.ascx"); 
     _PBUserControl = (PBUserControl)TemplateUserControl; 
     _PBUserControl.AddNameValuePair("TestContent", "It is working!!!!!!!!!"); 
     _PBUserControl.AddNameValuePair("Test", "Some test text."); 
     Template.Controls.Add(TemplateUserControl); 
    } 

    protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e) 
    { 
     IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs; 
    } 
} 

は私がここで何が起こっているかを説明しましょう。ここでは

public partial class Basic : PBUserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (this.IsPostBack == false) 
     { 
      this.InitializeControl(); 
     } 
     else 
     { 
      this.ProcessSubmit(); 
     } 
    } 

    private void InitializeControl() 
    { 
     DynamicLiteral.Text = "Some Dynamic Content. " + GetNameValue("TestContent"); 
     TestTextBox.Text = GetNameValue("Test"); 
    } 
    private void ProcessSubmit() 
    { 
     AddNameValuePair("TestContent", "Passing back some value... "+ DynamicLiteral.Text); 
     AddNameValuePair("Test", TestTextBox.Text); 
    } 
} 

は、この動的にロードされたコントロールを含むページの呼び出しです。メインページからPBUserControlの値を設定できます。動的にロードされたユーザーコントロールに完全に渡されます。それは何をすることになっていますか。すばらしく動作します。

ただし、ポストバック変数が処理される前に、動的に読み込まれたコントロール内のpage_loadイベントが発生しています。その時点でTextBoxの内容はまだ読み込まれていません。私はこれを研究によって見つけました。また、動的にロードされたコントロール内にPre_Renderedイベントを配置すると、デバッガでコードをステップ実行するときにTextBoxの値が表示されます。また、デバッガでは、Page_Loadイベント中にTextBoxが読み込まれないことがわかりました。私の研究は、以下に私を導く: 1. Page_Initイベントが 3.ページのフォーム変数を読み込み、 4.ユーザーイベントが呼び出される(どのようなイベントわからない)処理されますと呼ばれる 2. Page_Loadイベントと呼ばれている、すなわち:クリック時 5 Pre_Renderedイベントが呼び出されます。

手順3の後、手順4の前または途中で呼び出されるイベントを作成できるようにする必要があります。そうすれば、TextBox値を取得してPBUserControl.NVP変数内の値を読み取れるように設定できますメインページでPBUserControl.NVP変数に手動で値を設定すると、メインページにその値が表示され、正常に読み込まれます。

ありがとうございます。

答えて

0

私はそれを考え出しました!!!!基本的に私はイベントを作成し、それを動的にロードされたUserControlからメインのUserControlに渡しました。以下は私がそれを働かせるために行った変更です。すべての人がそれがどのように動作するかを追うことができるように、簡単な説明。 PBUserControlという外部ラッパーを使用して、継承していくつかの要素を作成することができます。その背後にあるアイデアは、データを前後に渡して、明らかにイベントを渡すことができるようにすることです。子コントロールを動的にロードするとき、要素やイベントを簡単に結びつける贅沢さはもはやありません。 PBUserControlクラスは、これを動作させる共通の結合を作成します。私の目的では、バックエンドでデータ構造がどのように設定されているかを理想的に設定するように設定されています。だからあなたのために働くように微調整をする必要があります。しかし、これはコンセプトに従うことが容易であることが証明されるべきである。

私は、動的コントロール内のアクションをPBUserControlにあるControlSubmittedHandlerに登録できます。

ControlSubmittedDelegateを介してControlSubmittedHandlerをローカルイベントに割り当てることで、親コントロールの動的コントロールからアクションを登録できます。その時点で私はそのイベントを引き起こすことができます。

十分

ここでの説明は、それを動作させるためにコードの変更です:

私はクラスPBUserControlに以下を追加:

public delegate void ControlSubmittedDelegate(object sender, EventArgs e); 
public System.EventHandler ControlSubmittedHandler; 

私の動的にロードされたコントロールの中で私は、Page_Loadイベントを変更:

私の動的にロードされたコントロール内に
protected void Page_Load(object sender, EventArgs e) 
{ 
    InitializeControl(); 
    this.ControlSubmittedHandler = new EventHandler(ControlSubmittedAction); 
} 

は、私が追加:

私が追加私のメインコントロール内
public void ControlSubmittedAction(object sender, EventArgs e) 
{ 
    ProcessSubmit(); 
} 

private PBUserControl _PBUserControl; 
private event PBUserControl.ControlSubmittedDelegate myEvent; 

を私のメインコントロール内に私が変更されました:

protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e) 
{ 
    myEvent = new PBUserControl.ControlSubmittedDelegate(_PBUserControl.ControlSubmittedHandler); 
    if (myEvent != null) myEvent(this, e); 

    IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs; 
} 
+0

かなり気の利いを!よくやった – Andrew

関連する問題