2017-06-29 4 views
0

コントロールがPlaceHolderのVisibleプロパティをfalseに設定した場合に、UserControl Page_Loadイベントを防止する必要があります。 私はすべての私のユーザーコントロールから派生し、このクラスはUserControlクラスから派生したいくつかの基本クラスを持っています。 私はこれを見つけました:How to stop the execution of UC at page load on Visible false 答えは、Page_Loadイベントハンドラの中で "this.Visible"を使用していました または、OnPreRenderメソッドをオーバーライドしてPage_Loadの代わりに使用することでした。Webフォームは、コントロール内のPage_Loadイベントを防ぎます。プレースホルダが偽であると表示されます。

BaseControl内でこの問題を解決するには、複数のコード変更を避けるために、 の方法が必要です。 可能ですか?

ありがとうございます!

答えて

0

Page_Loadの実行を邪魔することはできません。このイベントは、ページのライフサイクルの一部であるために発生します。しかし、あなたができることは、これに基づいて重いロジックを条件付きで実行することです。あなたいったん

// DerivedChildControlA.ascx 
<uc1:ChildControl runat="server" ID="someChildControlID" /> 




public abstract class BaseControl : UserControl 
{ 
    protected abstract ChildControl DerivedChild { get; } 
} 

public class DerivedChildControlA : BaseControl 
{ 
    protected override ChildControl DerivedChild 
    { 
     get { return this.someChildControlID; } 
    } 
} 

:あなたは、基本クラスから子コントロールの可視性を確認し、条件付きで(つまりが何であれ)が追加の共有ロジックを処理したい場合は

は、あなたがこのような何かを行うことができますその子への参照を取得すると、その可視性をチェックして、基本クラスで目的のアクションを実行できます。

たとえば、私が通常行っているすべてのUserControlsは、メインロードロジックをLoad()という別のメソッドに置きます。それから私は親からこのメソッドを呼び出します。つまり、条件付きでLoad()を呼び出すことで、より多くの制御を行うことができます。あなたのインスタンスでは、子コントロールの可視性に応じて、親基本クラスからLoad()を呼び出すことができます。

EDIT:

ページの子コントロールのコレクションから子コントロールを除去することによって、方法があるかもしれませんが、これはハックのように感じています。追加情報については、Aterraのコメントを参照してください。ASP.NET Forums.

+0

私は、基本クラスでイベントをロードするために購読することができ、ユーザーコントロールの前に、この火災Page_Loadと私はそこに可視性を確認することができます しかし、私はこの点で何をすべきかわからない似たような状況でいくつかの人々が提案したようにメソッドを呼び出すと呼び出されますが、それは私のためには機能しませんし、Page_Loadは依然として発砲しています –

+0

@BorisEvraevは私の編集を参照してください。 – Pavel

0

ユーザーコントロールを動的に読み込むことができます。次に、表示されていないにもかかわらず、読み込み中に問題が発生することはありません。だから、あなたがこれを行うことができますaspxページに:

if (showControl == true) 
{ 
    //create an instance of the user control 
    WebUserControl1 control1 = (WebUserControl1)LoadControl("~/WebUserControl1.ascx"); 

    //add it to the page when needed 
    PlaceHolder1.Controls.Add(control1); 
} 

唯一の欠点は、コントロールが各ポストバック後に消えてしまいますということですので、あなたがコントロールがどこかに示された場合に追跡する必要があり、必要に応じて、それを再作成します。

もう1つのことは、UserコントロールのPage_Loadを空のままにして、親ページから呼び出すメソッドを作成することです。

ユーザーコントロール

protected void Page_Load(object sender, EventArgs e) 
{ 
    //empty 
} 

public void doStuffInUserControl() 
{ 
    Label1.Text = "Called from parent!"; 
} 

親aspxページ

protected void Page_Load(object sender, EventArgs e) 
{ 
    someChildControlID.doStuffInUserControl(); 
} 
0
最後

私は解決策を見つけた:

public abstract class BaseClass : UserControl 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     if (this.Visible) 
     { 
      base.OnLoad(e); 
     } 
    } 
} 

public partial class WebUserControl1 : BaseClass 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // running only if this.Visible = true 
    } 
} 
関連する問題