- - PR -
マスターページを使用したページでPostBack時のDataSourceについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-01-16 09:40
どっとねっとふぁんさんのアドバイス通り、いったんマスターページとコンテンツページのイベントをコメント化して1つずつ試してみたところ、マスターページのPage_Initの記述があった場合にデータソースがクリアされていました。
Page_Initではセッション変数の取得ぐらいしか行っていなかったのですが、マスターページにPage_Initを記述するのはまずいのでしょうか? |
|
投稿日時: 2007-01-16 09:41
どっとねっとふぁんさんのアドバイス通り、いったんマスターページとコンテンツページのイベントをコメント化して1つずつ試してみたところ、マスターページのPage_Initの記述があった場合にデータソースがクリアされていました。
Page_Initではセッション変数の取得ぐらいしか行っていなかったのですが、マスターページにPage_Initを記述するのはまずいのでしょうか? |
|
投稿日時: 2007-01-16 10:43
マスターページ内のPage_Initの処理を全てコメントアウトしても現象は変わりませんか?
行っている処理の中に問題があるように思うのですが。。。 問題のある箇所がわかったのであれば、そこを細かく1行ずつ試していってみれば もう少し細かく問題点を絞り込めるのではないでしょうか。 #というか、なぜ問題を大きく、大きく考えようとするかなぁ。 マスターページの問題とかPage_Initの問題とか。。。 たいていおかしな動作は自分が書いたプログラムに問題があるものなので、 1行ずつ確認するのが基本だと思うんだが。。。 |
|
投稿日時: 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) |
|
投稿日時: 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) |
|
投稿日時: 2007-01-17 10:52
このGetPostBackControlというメソッドを何のために使っているのかわかりませんが。。。
ブレークポイントとかを使って確かめればはっきしりますが、実行時にLinkButtonを クリックしていますから、"__EVENTTARGET"としてはLinkButtonが返ってきているのでは ないかと思います。 この場合、LinkButtonはDataListの中に含まれていますので、 Page.FindControl(strCtrlname) の結果はNullになっているのではないでしょうか。 入れ子になっているコントロールの場合は、親のコントロールを指定した上で FindControlを使わないと子のコントロールは見つけられないはずです。 で、GetPostBackControlの戻り値としてNullが返っており、そのために何か処理が おかしくなってDataListの表示に影響を与えているのだと思います。 ということで、このGetPostBackControlはバグってますからなんらかの対処が 必要でしょうね。 どうしてもこのようなメソッドが必要というのであれば、コントロールの階層を たどって目的のコントロールを見つけられるような形にする必要があると思います。 まぁ、実際にこのメソッドがどんな目的のために使われているのかこちらでは わかりませんから、そのような修正で本当に正しく動くかどうかはわかりませんが。 |