none
FormViewで入力値をSessionに格納できない。 RRS feed

  • 質問

  • 顧客情報を登録するフォームを作成しています。
    入力画面からSessionに入力値を入れて、確認画面を表示したいと思っております。
    FormViewを設置し、その中の項目の値をSessionに格納したいです。

    「確認画面へ」というボタンを配置し、
    Button_Clickイベントで、Session格納とリダイレクトをしたいのですが。

    しかし、以下のようなエラーでうまく実装できておりません。
    「名前'NameSeiTextBox'は現在のコンテキスト内に存在しません。」
    あるいは、FindControlを使った場合は以下のようなエラー。
    「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

    どうぞアドバイス頂けないでしょうか。

    -----------------------------
    ▼DB情報:顧客テーブル(Customer)
    顧客ID:CustomerId
    氏名(姓):NameSei
    氏名(名):NameMei

    -----------------------------
    ▼エラー内容
    「名前'NameSeiTextBox'は現在のコンテキスト内に存在しません。」
    「NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。」

    -----------------------------
    ▼aspx
            <asp:FormView ID="FormView1" runat="server" DataKeyNames="Customer"
                DataSourceID="SqlDataSource1">
                <EditItemTemplate>
                    氏名(姓):<asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Eval("NameSei") %>' /><br />
                    氏名(名):<asp:TextBox ID="NameMeiTextBox" runat="server" Text='<%# Bind("NameMei") %>' /><br />
                    顧客Id:<asp:TextBox ID="CustomerIdTextBox" runat="server" Text='<%# Bind("CustomerId") %>' /><br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
                        CommandName="Update" Text="更新" />
                    &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
     ------------------------------------------------
     ここにボタン追加→→→    <asp:Button ID="Button1" runat="server" onclick="Button1_Click1" Text="確認画面へ" />
     ------------------------------------------------
                </EditItemTemplate>
                <InsertItemTemplate>
                    氏名(姓):<asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Eval("NameSei") %>' /><br />
                    氏名(名):<asp:TextBox ID="NameMeiTextBox" runat="server" Text='<%# Bind("NameMei") %>' /><br />
                    顧客Id:<asp:TextBox ID="CustomerIdTextBox" runat="server" Text='<%# Bind("CustomerId") %>' /><br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
                        CommandName="Insert" Text="挿入" />
                    &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
     ------------------------------------------------
     ここにボタン追加→→→    <asp:Button ID="Button2" runat="server" onclick="Button1_Click1" Text="確認画面へ" />
     ------------------------------------------------
                </InsertItemTemplate>
                <ItemTemplate>
                    氏名(姓):<asp:Label ID="NameSeiLabel" runat="server" Text='<%# Eval("NameSei") %>' /><br />
                    氏名(名):<asp:Label ID="NameMeiLabel" runat="server" Text='<%# Bind("NameMei") %>' /><br />
                    顧客Id:<asp:Label ID="CustomerIdLabel" runat="server" Text='<%# Bind("CustomerId") %>' /><br />
                    <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False"
                        CommandName="Edit" Text="編集" />
                    &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False"
                        CommandName="New" Text="新規作成" />
                </ItemTemplate>
            </asp:FormView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConflictDetection="CompareAllValues"
                ConnectionString="<%$ ConnectionStrings:xxxConnectionString %>"
                InsertCommand="INSERT INTO [Customer] ([CustomerId], [NameSei], [NameMei])
                    VALUES (@CustomerId, @NameSei, @NameMei)"
                OldValuesParameterFormatString="original_{0}"
                SelectCommand="SELECT * FROM [Customer]"
                UpdateCommand="UPDATE [Customer]
                    SET [NameSei] = @NameSei, [NameMei] = @NameMei, [CustomerId] = @CustomerId
                    WHERE [CustomerId] = @original_CustomerId
                    AND (([CustomerId] = @original_CustomerId)
                    OR ([CustomerId] IS NULL AND @original_CustomerId IS NULL))">
                    AND (([NameSei] = @original_NameSei)
                    OR ([NameSei] IS NULL AND @original_NameSei IS NULL))
                    AND (([NameMei] = @original_NameMei)
                    OR ([NameMei] IS NULL AND @original_NameMei IS NULL))
                <InsertParameters>
                    <asp:Parameter Name="CustomerId" Type="Int32" />
                    <asp:Parameter Name="NameSei" Type="String" />
                    <asp:Parameter Name="NameMei" Type="String" />
                </InsertParameters>
                <UpdateParameters>
                    <asp:Parameter Name="NameSei" Type="String" />
                    <asp:Parameter Name="NameMei" Type="String" />
                    <asp:Parameter Name="CustomerId" Type="Int32" />
                    <asp:Parameter Name="original_CustomerId" Type="Int32" />
                    <asp:Parameter Name="original_NameSei" Type="String" />
                    <asp:Parameter Name="original_NameMei" Type="String" />
                </UpdateParameters>
            </asp:SqlDataSource>
    </asp:Content>

    -----------------------------
    ▼aspx.cs
    namespace WebApplication1
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }

            protected void Button1_Click1(object sender, EventArgs e)
            {
                Session["Session_NameSeiTextBox"] = NameSeiTextBox.Text;
                Session["Session_NameMeiTextBox"] = NameMeiTextBox.Text;
                Session["Session_CustomerIdTextBox"] = CustomerIdTextBox.Text;
               
                //Session["Session_NameSeiTextBox"] = ((TextBox)((this.FindControl("FormView1")).FindControl("NameSeiTextBox"))).Text;
                Response.Redirect(string.Format("~/WebForm2.aspx"));
            }
        }
    }

    2012年6月18日 7:10

回答


  • 以下のページで、FormView を使うのは、ご自分で「トンチンカン
    な事をしていた」と認識されたと思っていましたが・・・

    MultiViewの入れ子は可能ですか(Webフォームの確認画面を実装)
    http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/9435683a-40ab-43ca-b66b-bdbc3be28f26

    確認は FormView 上でできるはずなのに、なぜそうまで別画面での
    確認にこだわるのでしょう?


    ちなみに、エラーの理由ですが、

    > 名前'NameSeiTextBox'は現在のコンテキスト内に存在しません。

    FormView, DetailsView, GridView などのテンプレートに配置した
    コントロールは動的に生成されるので、NameSeiTextBox というよう
    に静的に参照することはできません。

    > NullReferenceException: オブジェクト参照がオブジェクト
    > インスタンスに設定されていません。

    これは原因不明です。普通は以下のようにしますが、アップされてい
    たコードでも取得できるはずです。"NameSeiTextBox" が間違っている
    ということはありませんか? なにが null なのか調べてください。

    Session["Session_NameSeiTextBox"] =
      ((TextBox)FormView1.FindControl("NameSeiTextBox")).Text;

    • 回答としてマーク ミルズ 2012年6月18日 22:38
    2012年6月18日 12:01

すべての返信

  • コントロールツリー(コントロールの階層構造)がどうなっているかよく調べてみてください。
    FormViewのような複合コントロールの場合、その中でコントロールのツリー構造が複雑な形で存在していたりします。

    FindControlは指定したコントロールの直下に存在するコントロールしか見つけることができないので、FormViewのなかでコントロールツリーが構成されている場合、みつけようとするコントロールのすぐ上のコントロールに適用するか、再帰的にFormViewのコントロールツリーの中を探っていく必要があります。

    コントロールツリーを確認するには、、、Pageディレクティブでトレースを有効にして確認するのがいいかと思います。

    http://msdn.microsoft.com/ja-jp/library/bb386420.aspx


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年6月18日 10:44

  • 以下のページで、FormView を使うのは、ご自分で「トンチンカン
    な事をしていた」と認識されたと思っていましたが・・・

    MultiViewの入れ子は可能ですか(Webフォームの確認画面を実装)
    http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/9435683a-40ab-43ca-b66b-bdbc3be28f26

    確認は FormView 上でできるはずなのに、なぜそうまで別画面での
    確認にこだわるのでしょう?


    ちなみに、エラーの理由ですが、

    > 名前'NameSeiTextBox'は現在のコンテキスト内に存在しません。

    FormView, DetailsView, GridView などのテンプレートに配置した
    コントロールは動的に生成されるので、NameSeiTextBox というよう
    に静的に参照することはできません。

    > NullReferenceException: オブジェクト参照がオブジェクト
    > インスタンスに設定されていません。

    これは原因不明です。普通は以下のようにしますが、アップされてい
    たコードでも取得できるはずです。"NameSeiTextBox" が間違っている
    ということはありませんか? なにが null なのか調べてください。

    Session["Session_NameSeiTextBox"] =
      ((TextBox)FormView1.FindControl("NameSeiTextBox")).Text;

    • 回答としてマーク ミルズ 2012年6月18日 22:38
    2012年6月18日 12:01
  • Session["Session_NameSeiTextBox"] =
      ((TextBox)FormView1.FindControl("NameSeiTextBox")).Text;

    頂いた内容で解決する事が出来ました。

    大変ありがとうございました。

    ご指摘いただいた内容も、お恥ずかしい限りです。

    2012年6月18日 22:38