2009-05-20 13 views
2

私は2つのaspxページを持っています。これは非常によく似ており、コードの背後にはさまざまな機能があります。私は両方のコードの背後にあるクラスから派生する基本クラスを作成したいと思います。基本クラスがaspxページのコントロールにアクセスすることは可能ですか?例えば:ベースクラスのaspxコントロールを使用

class base 
    inherits System.Web.UI.Page 
    Sub prepareScreen() 
     'txtName is a text box on the aspx page 
     Me.txtName.text = "George" 
    end sub 
end class 

class codeBehind 
    inherits base 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      prepareScreen() 
    end sub 
end class 

はやや当然のコードでは、とのコンパイルに失敗します。

'txtName' is not a member of 'clsbase' 

は、それが2一緒にリンクすることは可能ですか?

+0

もう一度答えを確認してください。私はもう少し説明を追加しました。 – Kirtan

+0

Hmmm。両方のページで値を設定する場合は、OOishではなくFindControlの方法を使用できます。 – Kirtan

+0

しかし、UI関連のメソッドはページ内で分離しなければならず、共通化しないでください。ここでは、ページ上のテキストボックスにテキストを設定したいので、一般的なものではなく、コードを複製して両方のページに設定することをお勧めします。 – Kirtan

答えて

2

コントロールを基本クラスのプロパティとして宣言する必要があります。 ASPマークアップで、CodeFileBaseClass属性を使用します。

MSDN referenceはご利用いただけません。

class base 
    inherits System.Web.UI.Page 
    Protected Property txtName() As TextBox 
    Sub prepareScreen() 
     'txtName is a text box on the aspx page 
     Me.txtName.text = "George" 
    end sub 
end class 

class codeBehind 
    inherits base 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      prepareScreen() 
    end sub 
end class 

<%@ page CodeFileBaseClass="base" inherits="codebehind" ... %> 
+0

ビジュアルデザイナーを使用してページが既に設計されているため、これを使用できませんでした。コード内のすべてのコントロールの位置を設定するのに時間がかかりました。ありがとう – Patrick

0

FindControlを使用できます。

TextBox txtName=FindControl("txtName"); 

レンダリングされたページが子孫クラスによってレンダリングされたにもかかわらずコントロールを見つけることができます。これはオブジェクト指向の点と機能/データの分離を幾分破壊しています。

0

((TextBox)Page.FindControl( "txtName"))を使用してテキストボックスを取得できます。コントロールが存在しない可能性があるこの基底クラスelseを使用する場合は注意してください。

+0

本当にやりたいことではありません。基本クラスと派生クラスの両方でコントロールが「ネイティブ」にアクセスできるようにしたいと思います。派生クラスは実際には別のaspxページにリンクしていますが、共通のコントロールが多数あります。どのようにして – Patrick

2

コードをリファクタリングして、このようなことを行う必要がないようにする方が良いでしょう。

基本クラスに仮想メソッドを作成すると、子ページでオーバーライドしたり、テキストボックスの値を設定したりすることができます。テキストボックス。あなたの明確化に対応して

+0

リファクタリング?現在のコードをリファクタリングし、繰り返しコードを基底クラスに取り除こうとしています。 – Patrick

+0

ありがとうございますKirtan。問題は2つの別々のページでGeorgeに値を設定したいということです... – Patrick

0

あなたがプロパティを作成することができます。

protected TextBox txtName 
{ 
get{return (TextBox)Page.FindControl("txtName");} 
set{Page.FindControl("txtName") = vale;} 
} 

または仮想プロパティを作成します:

あなたがでそれを無効にする必要があります。この場合
protected virtual TextBox txtName{get;set;} 

あなたのメインクラス

protected override TextBox txtName{/*same as above*/} 
関連する問題