プロが教える店舗&オフィスのセキュリティ対策術

VisualStudio2010/.NET4.0で開発しています。

やりたい事
 ・以下のVBのC#版を作りたい。
  継承元のPage_Loadを実行させたい

Public Class Base
 Inherits System.Web.UI.Page

  Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   Response.Write("親Page_Load")
  End Sub

End Class


Public Class _Default
 Inherits Base

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   Response.Write("子Page_Load")
  End Sub
End Class

上記のaspは実行すると画面上に「親Page_Load子Page_Load」と表示される。
だが、以下のプログラムでは「子Page」としか表示されないので困っております。

public class Base : System.Web.UI.Page
{
 private void Page_Load(object sender, EventArgs e)
 {
  Response.Write("親Page");
 }
}

public partial class _Default : Base
{
 protected void Page_Load(object sender, EventArgs e)
 {
  Response.Write("子Page");
 }
}
よろしくお願いいたします。

A 回答 (2件)

Page_LoadメソッドをPageクラスのLoadイベントに紐付ける必要がある。



VBは、Handles Me.Load で紐付けている。

_defaultクラスは、default.aspxファイルの AutoEventWireup="true" により自動的に紐付けられる。

> public class Base : System.Web.UI.Page

こちらは、紐付けていないのでコンストラクタで明示的に書く必要がある。

this.Load += Page_Load;

--
個人的には、親クラスでOnLoadメソッドのオーバーライドがお勧め。

public partial class Base : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
//Loadイベント発生前の処理をここに書く
base.OnLoad(e);
//Loadイベント発生後の処理をここに書く
}
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
順序が子のPage_Loadから親のPage_Loadの順番にはなりましたが、
上記の方法で私の中の問題は解決しました。
ありがとうございました。

お礼日時:2012/11/14 18:58

言語仕様の話かなぁ。



http://ufcpp.net/study/csharp/oo_inherit.html

上記ページの「基底クラスのメンバーの隠蔽」あたりがひっかかってる気がします。
VBはこのあたりの解釈が異なるのではないかと。

あと、ASP.NETの特にページの場合、その仕組みから継承をうまく利用するのはかなり難しいと思います。
複数のページで統一的な画面を作るのであれば、そのための仕組みとして用意されている
マスターページやユーザーコントロールをうまく使えないか考えてみたほうがいいと思います。

また、このプログラムは動作を確認するためのサンプルとしてResponse.Writeを
利用しているのでしょうが、通常のコントロールとResponse.Writeを組み合わせると
きっと意図していないHTMLが生成されるので、注意が必要です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考にいたします。

お礼日時:2012/11/14 18:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!