none
FormView内に配置したLavelのテキストプロパティをSessionに格納するには? RRS feed

  • 質問

  • 【開発環境】Visual Studio 2008, Visual Basic, SQL Server2005 Express Edition

     

    一覧表示のためのページにFormViewを配置して、その中にLavelを複数配置して、DB(日付をプライマリーキーとして設定)から取得したレコードをデータバインドして表示させています。

    同一ページ内に設置したButtonのClick イベントプロシージャで、FormView内の日付情報がバインドされた Label のTextプロパティを取得してSessionに格納させたいのですがうまくいきません。

    目的としては、一覧表示用のページ(Index.aspx)にある指定枠(FormView)から詳細ページ(Read.aspx)へ遷移したいのですが…

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Session("date") = FormViewRead.BindingContainer
            Response.Redirect("Read.aspx")
        End Sub

    下線の部分に日付情報を入れると、その日付の内容でRead.aspxを参照することができます。

    日付情報がバインドされたLavelのIDが"Lavel1"なのですが、下線部にLavel1.Textとすると「名前’Lavel1’は宣言されていません」とオブジェクト名が違っている旨がインテリセンス上に表示されます。

    なにとぞアドバイスの程、よろしくお願いいたします m(_ _)m

    2010年6月4日 7:42

回答

  • ごく基本的なことですが、メソッドの引数と戻り値が何か、その型は何か強く
    意識してコーディングするようにしてください。

    FindControl(String id) メソッドの場合、引数 id は検索するコントロールの
    ID で、戻り値は検索で見つかったコントロールへの参照値です。

    > FormView内の日付情報がバインドされた Label のTextプロパティを取得して
    > Sessionに格納させたいのですがうまくいきません。

    ということであれば、その Label の ID が引数になります(Text プロパティで
    はありません)。

    引数に指定した ID の Label が見つかれば、その Label への参照値を Control
    型として返します(これも Text プロパティではありません)。見つからなけれ
    ば null(VB の場合は Nothing)を返します。

    従って、目的の Label の ID が Label1 であれば、引数は "Label1" とするのが
    正しいです。

    戻り値は Control 型になりますので、それを Label 型にキャストしてから Text
    プロパティを取得してから Session に代入するというステップが必要です。

    2010年6月6日 3:15

すべての返信

  • FormViewのようなコントロールの中に配置したコントロールの情報を取り出す場合、FormView1.FindControl(コントロール名)とかして探し出してから情報を取り出す必要があります。
    場合によっては、FormViewの中のなんらかのコントロールの中の、、、ともっと階層が深くなる場合もあります。
    そのあたり注意してみてはどうでしょうか。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2010年6月4日 8:40
  •    小野様 ご教示ありがとうございます。

     ご指摘の点を踏まえて、イベントプロシージャを

       Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Session("date") = Me.FormViewRead.Row.FindControl("Label1.Text")
            Response.Redirect("Read.aspx")
        End Sub

    としてみたのですが、Sessionに格納できていないようで、参照ページで指定内容を受け取ることができません。

    インテリセンス上の波線もなく、ビルドエラーは起こらないのですが…

    引き続きアドバイスをいただけますと幸いです。

    2010年6月5日 9:12
  • FindControl メソッドの引数が間違っているのではないですか? ("Label1" とすべきでは?)
    2010年6月5日 10:53
  • SurferOnWwwさま

    ありがとうございます。

    Session("date") = Me.FormViewRead.Row.FindControl("Label1")

    としてビルドいたしますと、『オブジェクトは IConvertible を実装しなければなりません。』と、サーバーエラーが発生してしまいます。

    Session("date") = Me.FormViewRead.Row.FindControl("Label1.Text")

    に再び設定いたしますと、Session("date")の引渡しはないのですが、

    Response.Redirect("Read.aspx") のステートメントまでは実行されます…。

    引き続きアドバイスをいただけますと幸いです。

    2010年6月6日 1:22
  • ごく基本的なことですが、メソッドの引数と戻り値が何か、その型は何か強く
    意識してコーディングするようにしてください。

    FindControl(String id) メソッドの場合、引数 id は検索するコントロールの
    ID で、戻り値は検索で見つかったコントロールへの参照値です。

    > FormView内の日付情報がバインドされた Label のTextプロパティを取得して
    > Sessionに格納させたいのですがうまくいきません。

    ということであれば、その Label の ID が引数になります(Text プロパティで
    はありません)。

    引数に指定した ID の Label が見つかれば、その Label への参照値を Control
    型として返します(これも Text プロパティではありません)。見つからなけれ
    ば null(VB の場合は Nothing)を返します。

    従って、目的の Label の ID が Label1 であれば、引数は "Label1" とするのが
    正しいです。

    戻り値は Control 型になりますので、それを Label 型にキャストしてから Text
    プロパティを取得してから Session に代入するというステップが必要です。

    2010年6月6日 3:15
  • SurferOnWwwさま

    ご教示ありがとうございます。

    Dim ctrl As Label = DirectCast( Me.FormViewRead.Row.FindControl("Label1"),Label)
    Session("date") = ctrl.Text

    で、無事動作しました。

    2010年6月6日 4:57