トップ回答者
FormViewで入力値をSessionに格納できない。

質問
-
顧客情報を登録するフォームを作成しています。
入力画面から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="更新" />
<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="挿入" />
<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="編集" />
<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"));
}
}
}
回答
-
以下のページで、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
すべての返信
-
コントロールツリー(コントロールの階層構造)がどうなっているかよく調べてみてください。
FormViewのような複合コントロールの場合、その中でコントロールのツリー構造が複雑な形で存在していたりします。FindControlは指定したコントロールの直下に存在するコントロールしか見つけることができないので、FormViewのなかでコントロールツリーが構成されている場合、みつけようとするコントロールのすぐ上のコントロールに適用するか、再帰的にFormViewのコントロールツリーの中を探っていく必要があります。
コントロールツリーを確認するには、、、Pageディレクティブでトレースを有効にして確認するのがいいかと思います。
http://msdn.microsoft.com/ja-jp/library/bb386420.aspx
あおい情報システム株式会社 小野修司(どっとねっとふぁん)
-
以下のページで、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