- PR -

マスターページを使用したページでPostBack時のDataSourceについて

投稿者投稿内容
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-16 09:40
どっとねっとふぁんさんのアドバイス通り、いったんマスターページとコンテンツページのイベントをコメント化して1つずつ試してみたところ、マスターページのPage_Initの記述があった場合にデータソースがクリアされていました。

Page_Initではセッション変数の取得ぐらいしか行っていなかったのですが、マスターページにPage_Initを記述するのはまずいのでしょうか?
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-16 09:41
どっとねっとふぁんさんのアドバイス通り、いったんマスターページとコンテンツページのイベントをコメント化して1つずつ試してみたところ、マスターページのPage_Initの記述があった場合にデータソースがクリアされていました。

Page_Initではセッション変数の取得ぐらいしか行っていなかったのですが、マスターページにPage_Initを記述するのはまずいのでしょうか?
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-01-16 10:43
マスターページ内のPage_Initの処理を全てコメントアウトしても現象は変わりませんか?
行っている処理の中に問題があるように思うのですが。。。

問題のある箇所がわかったのであれば、そこを細かく1行ずつ試していってみれば
もう少し細かく問題点を絞り込めるのではないでしょうか。

#というか、なぜ問題を大きく、大きく考えようとするかなぁ。
 マスターページの問題とかPage_Initの問題とか。。。
 たいていおかしな動作は自分が書いたプログラムに問題があるものなので、
 1行ずつ確認するのが基本だと思うんだが。。。
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-17 09:29
どっとねっとふぁんさんの言われたとおり、1行ずつ問題を検証してみたところ、Page_InitからCALLしていたポストバック元のコントロールを取得するファンクションを1行コメント化することで、コントロールの値が保持できました。
次回より問題を小さく捉えられるようがんばります。
ありがとうございました。

ファンクション
Public Function GetPostBackControl(ByVal Page As Page) As Control
Dim Ctrl As Control
Dim strCtrlname As String
Ctrl = Nothing
strCtrlname = Page.Request.Params.Get("__EVENTTARGET")
If IsNothing(strCtrlname) = False And strCtrlname <> String.Empty Then
'Ctrl = Page.FindControl(strCtrlname)
Else
For Each ctl As String In Page.Request.Form
Dim c As Control = Page.FindControl(ctl)
If IsNothing(c) = False Then
If TypeOf c Is System.Web.UI.WebControls.Button Then
Ctrl = c
End If
End If
Next ctl
End If
Return Ctrl
End Function

コメント化した行
Ctrl = Page.FindControl(strCtrlname)

ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-17 09:29
どっとねっとふぁんさんの言われたとおり、1行ずつ問題を検証してみたところ、Page_InitからCALLしていたポストバック元のコントロールを取得するファンクションを1行コメント化することで、コントロールの値が保持できました。
次回より問題を小さく捉えられるようがんばります。
ありがとうございました。

ファンクション
Public Function GetPostBackControl(ByVal Page As Page) As Control
Dim Ctrl As Control
Dim strCtrlname As String
Ctrl = Nothing
strCtrlname = Page.Request.Params.Get("__EVENTTARGET")
If IsNothing(strCtrlname) = False And strCtrlname <> String.Empty Then
'Ctrl = Page.FindControl(strCtrlname)
Else
For Each ctl As String In Page.Request.Form
Dim c As Control = Page.FindControl(ctl)
If IsNothing(c) = False Then
If TypeOf c Is System.Web.UI.WebControls.Button Then
Ctrl = c
End If
End If
Next ctl
End If
Return Ctrl
End Function

コメント化した行
Ctrl = Page.FindControl(strCtrlname)

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-01-17 10:52
このGetPostBackControlというメソッドを何のために使っているのかわかりませんが。。。

ブレークポイントとかを使って確かめればはっきしりますが、実行時にLinkButtonを
クリックしていますから、"__EVENTTARGET"としてはLinkButtonが返ってきているのでは
ないかと思います。
この場合、LinkButtonはDataListの中に含まれていますので、
Page.FindControl(strCtrlname)
の結果はNullになっているのではないでしょうか。
入れ子になっているコントロールの場合は、親のコントロールを指定した上で
FindControlを使わないと子のコントロールは見つけられないはずです。
で、GetPostBackControlの戻り値としてNullが返っており、そのために何か処理が
おかしくなってDataListの表示に影響を与えているのだと思います。

ということで、このGetPostBackControlはバグってますからなんらかの対処が
必要でしょうね。
どうしてもこのようなメソッドが必要というのであれば、コントロールの階層を
たどって目的のコントロールを見つけられるような形にする必要があると思います。
まぁ、実際にこのメソッドがどんな目的のために使われているのかこちらでは
わかりませんから、そのような修正で本当に正しく動くかどうかはわかりませんが。

スキルアップ/キャリアアップ(JOB@IT)