2011-11-09 15 views
1

私はWebusercontrols ".ascx"をいくつか持っていて、App_Codeフォルダ内の関数クラスにコードを入れたいと思っていますが、このコードを試してみると、 "オブジェクト参照はオブジェクトのインスタンス"webcontrolからの.csクラスのfindcontrol

public static void Layout() 
    { 
    Page pg = (Page)HttpContext.Current.Handler; 
    PlaceHolder PH = (PlaceHolder)pg.FindControl("PHolder"); 
} 
+1

あなたはどの行に詳細情報を説明することができますを行いますnullを取得しますか? 「pg」や「PH」では? – clklachu

+0

ページのライフサイクルがまだ完了していないため、彼のプレースホルダPHはnullだと思います。私は彼が["Id_form"]という形式(ここでは唯一の仮定) – Nordes

+0

を使用する場合、彼が彼のコントロールを見つけることができるかもしれないと思います:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – Chris

答えて

0

nullを取得していて例外ではない場合は、Pageが正しく評価されていることを意味します。しかし、そうでないかもしれないものは、

PlaceHolder PH = (PlaceHolder)pg.FindControl("PHolder"); 

実際にはPHolderコントロールがページに属しているとは限りません。ほとんどの場合、このコントロールは一部の子コントロールに属しています。 FindControl()メソッドは再帰関数ではありません。それはすぐにそれに属しているコントロールコレクションを検索します。これを動作させるには、このPHolderを見つけようとしている実際の親コントロールを渡すか、System.Web.UI.PageのFindControlメソッドをオーバーロード/拡張する必要があります(使用している場合はベースクラス)再帰的になる。この方法には注意してください。なぜなら、ページにはたくさんのコントロールを持たせることができ、この種の再帰はかなり重くなるからです。

PHolderコントロールがすべてのページで共通の場合、このPHolderオブジェクトへの参照を保持するベースクラスにプロパティを配置し、そのようにアクセスすることは好ましくありません。

0

このことができますが、私はaspxページ内の関数を呼び出し、その関数が、それは私が必要と同じようにしますascxファイルを持っている場合は、非常にわからない。..

//ascx 

protected void btnSave_Click(object sender, EventArgs e) 
{ 
((aspxpage)this.Page).functionName(); 
} 

//aspx 

public void functionName() 
{ 
//Call function in app_code class 
}