質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

14397閲覧

動的に作成した要素がポストバックによって消えてしまう

teretail

総合スコア22

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2017/07/10 23:33

ASP.NETにて以下のようなプログラムで動的にチェックボックスのリストを作成しています。

aspx

1<div id="option_list" runat="server"></div> 2

ASP.NET

1Dim optionList As String() = {"オプション1", "オプション2", "オプション3", "オプション4", "オプション5"} 2 3For count As Integer = 0 To optionList.Count - 1 4 Dim checkBox As CheckBox = New CheckBox() 5 checkBox.Text = optionList(count) 6 checkBox.InputAttributes.Add("value", count.ToString) 7 8 Dim div As Panel = New Panel() 9 div.Attributes.CssStyle.Add("width", "90%") 10 div.Controls.Add(checkBox) 11 12 Me.option_list.Controls.Add(div) 13Next count 14

これ自体には問題ありませんが、ポストバックが発生した場合、
このチェックボックスのリストがなくなってしまいます。

Me.option_list.InnerHtmlに値を設定した場合は
ポストバックが発生しても消えないので、
htmlを組んで設定するのが正しいでしょうか?

ご教示の程、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動的に生成したコントロールはポストバックの際にも動的に生成する必要があります。それがされてますか?

どのタイミングでコントロールを動的に生成したのかわかりませんが、もし必ず発生するイベントハンドラ(page_init とか)ではなくて,ボタンクリックとかですとそれができてないかも。

投稿2017/07/11 01:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teretail

2017/07/11 13:06

ご回答ありがとうございます。 コントロールの生成はページロード時に行っています。 上記のコードは掲載用に固定値のリストとしましたが、実際にはDBから取得したリストを表示しようとしています。 それ故、ポストバックの都度コントロールの生成を行うのは重いと考え、質問させて頂きました。 ループ内で<div><input type="checkbox" value=...という文字列を組んで、 Me.option_list.InnerHtmlに設定した場合はポストバック時にも残っているのですが、Controls.Addの場合とどう違うのでしょう?
退会済みユーザー

退会済みユーザー

2017/07/11 14:20

そのコードを Page_Load で実行させたのですよね。であればポストバックで CheckBox が消えてしまうということはあり得ないです。質問には書いてない別のところに問題があるということではないのですか? コピペすれば問題を再現できる必要最低限のサンプルコードを書いてアップできませんか。 それにしても、全体的に何かやり方が変だと思うのですが・・・ 質問者さんはどのぐらい ASP.NET Web Forms アプリの開発スキルをお持ちなのでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/12 01:17 編集

> それ故、ポストバックの都度コントロールの生成を行うのは重いと考え、質問させて頂きました。 上記のところはどういう意味でしょう? ひょっとして if (!IsPostBacK) で CheckBox 生成のコードを囲うとかしてません? そういうことをすればポストバック時に CheckBox が消えてしまうのは当たり前です。
退会済みユーザー

退会済みユーザー

2017/07/12 02:05

> 上記のコードは掲載用に固定値のリストとしましたが、実際にはDBから取得したリストを表示しようとしています。 複数の CheckBox を動的に生成するなんてことを自力でコードを書いて行うなんてことは、他に手段がない限り、止めた方が良いと思います。初心者なら特に。 大体のケースでは、自力でコードを書くよりはるかに容易な手段が ASP.NET の出来合いのサーバーコントロールとして準備されていることが多いので、それを利用することを検討してください。 今回の質問者さんのケースでは、CheckBoxList をデータソースコントロール(SqlDataSource や ObjectDataSource)と組み合わせつて使うことを検討してみてください。 それを使えない理由は多分ないはず。 多分ウィザードベースで自力では一行もコードを書かないで実装できると思います。(注:選択結果を取得して処置を行うというところは自力でコードを書く必要はあると思いますが) 普通にウィザードベースで作れば、DB にクエリを投げてデータを取得するのは初期画面の表示の時だけで、ポストバックの際はデータは ViewState から取得してコントロールを生成するようにできるので、ポストバックの都度 DB にクエリを投げるのは避けられます。
teretail

2017/07/13 05:00

コメントありがとうございます。 すみません。昨日出掛ける前に書き込んだつもりだったのですが、書き込めていませんでした・・・ 早速SqlDataSourceやObjectDataSourceについて調べてみます。
退会済みユーザー

退会済みユーザー

2017/07/16 01:57

> 早速SqlDataSourceやObjectDataSourceについて調べてみます。 ASP.NET Web Forms アプリの開発をしていてそれを知らないということは有り得ないぐらいの基本のキなのですよ。本などを読んで体系的に知識を付けることをお勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問