2011-01-04 11 views
1

私は、クリックすると以前にビューステートに保存されていたEventHandlerを呼び出すメソッドを呼び出し、このメソッドはクライアントページにあり、それを実行します。クライアントページのコントロールにアクセスするmasterpageのイベントハンドラ

protected void Save_Click(object sender, EventArgs e) 
    { 

     this.SaveButtonEvent += (EventHandler)ViewState["saveEvent"]; 
     if (this.SaveButtonEvent != null) 
     { 
      this.SaveButtonEvent(sender, e); 

     } 

    } 

これは、クライアントのページに非常に簡単なメソッドを呼び出します。

protected void Button2_Click(object sender, EventArgs e) 
{ 

    Label1.Text = TextBox2.Text; 
} 

しかし、TextBox2をの値が間違っている、それはページがロードされたときに設定されたテキストボックスの値であり、 (またはページの他のアイテムがそれを変更した場合)、新しい値は渡されません。

ボタンをクライアントページに追加すると、Button2_Clickイベントが直接呼び出され、正しい値が取得されます。

イベントがマスターページから呼び出されるため、テキストボックスの正しい値が得られないのはなぜですか?どんな解決策ですか?

このボタンは動的に作成され、イベントデリゲートは変更されるため、実行時にこのボタンを設定する必要があります。デリゲートをクリックして設定し、それが再び変更されるまで保持する方法が必要です。

答えて

1

いいえ、その理由はviewstateでデリゲートを保存したためです。

デリゲートを取得すると、デリゲートが作成されたページのコントロールを参照するため、存在しなくなったページオブジェクトのコントロールが使用されます。

+0

ああ、私はあまりにもセッションでそれを保存しようとしているが、同じで、(理にかなっています結果)私はどこでポストバックの間にそれを格納することができます示唆できますか? –

+0

@Sam:ポストバックの間にコントロールオブジェクトを格納することはできません。コントロールオブジェクトは、それらが使用されるページオブジェクト用に作成する必要があります。可能であれば、それは現在のページのコントロールではないので役に立たないので、変更すると目に見える効果はありません。現在のページオブジェクトにあるコントロールにアクセスする必要があります。例えば、 '((TheClientPage)Page).Label1.Text'のように、' Page'参照を実際のページクラスにキャストして、そのメンバーにアクセスできます。 – Guffa

+0

ありがとう、私はそれに非常によく似た何かをやって、イベントハンドラを正しい時刻に取得しました。 –

1

代わりに、コンテンツページで処理できるマスターページからイベントを公開できますか?

マスターページ:

public event EventHandler<EventArgs> AfterSave; 
protected void Save_Click(object sender, EventArgs e) 
{ 
    if(AfterSave != null) AfterSave(this, EventArgs.Empty); 
} 

コンテンツページ:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MasterPageObject m = (MasterPageObject)base.Master; 
    m.AfterSave += onMasterSave; 
} 
private void onMasterSave(object sender, EventArgs e) 
{ 
    // Your processing here 
} 

- パベル

関連する問題