- - PR -
VB.NET WEBフォームの更新について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2002-07-25 23:47
いつもお世話になっております。
VB.NETでテーブルコントロールの入ったWEBフォームを作成しました。 毎回、条件に応じてテーブルのRow、Columnの数は変化し、各セルにテキストボックスと隠しタグをいれて、条件に応じた値を入れます。勿論、これらの操作はVBで行っています。 ところが、ポストバック後、フォームを変更してもテーブルはクライアント側では以前の表示のままで、変更が反映されません。ViewStateを切っても状況は同じでした。ところが、一度、テーブルを非表示の状態にし、ポストバック後、再度表示するとうまくいきました。 思った通りの画面のレンダリングができないでいます。 わかる方、どうか教えてください。よろしくお願いします。 |
|
投稿日時: 2002-07-26 01:06
最近はとみに暑いですね。会社のクーラーがたまにオーバーヒートすると、身の周りに10台を超えるマシンの熱波で死にそうになります。サーバ運用上も怖いので夏は嫌な季節でもあります。
・・・・どーでもいい話ですね(笑)。 >ところが、ポストバック後、フォームを変更してもテーブルはクライアント側では以 前の表示のままで、変更が反映されません。ViewStateを切っても状況は同じ でした。ところが、一度、テーブルを非表示の状態にし、ポストバック後、再度表 示するとうまくいきました。 Table Web サーバコントロールは標準で動的な列と行の追加、その表示をサポートしています。ヘルプ文中「Table Web サーバー コントロールへの行およびセルの動的な追加」についているサンプルでもそれを確かめられますが、となるとWEIWEIさんの環境では不可思議な動きをしていることになります。推測ですが、原因は二つ考えられると思われます。 1.コーディング上おかしな部分がある。 ですが、一度非表示にして表示し直せば表示されるとなると、おそらくその可能性は薄いかなと。 2.「クライアント側では」という表現の裏にある問題。 この表現だと、開発環境においてはきちんと動作しているということでしょうか?その上で、一般のクライアントのブラウザー上では動作がおかしいということであるならば、原因はコーディングよりも、キャッシュやプロキシーなどネットワークやクライアントのブラウザーの設定によるものなのかもしれません。 .NETといえども、ブラウザーやネットワークの設定はもろに影響を受けます。とくにVS.NETのGUI画面上で、GRID LAYOUTを用いてフォームデザインなどをしていると、IEではもちろん問題ないのですが、OPERAなど他のブラウザーで見ると、意識が消失しそうな表示をします(笑)まぁ、これは.NETがというよりOPERAの仕様の問題ですが、なかなか頭の痛い問題です。 また話がそれましたが、ご参考になりましたら幸いです。 _________________ -------------------------------------- ネットビルド 小田原貴樹 odahara@netbuiuld.jp -------------------------------------- |
|
投稿日時: 2002-07-26 04:42
私は開発環境が英語のため、マニュアルを正確に読みこなしているか
自信がありませんが、テーブルコントロールはポストバックの都度、 変更したテーブルの内容が初期化され、初期状態に戻るので、 ポストバック後も変更を反映させたければDataGridかDataListを 使いなさいと記述されていたと記憶しております。 はずしてたらすみません。 |
|
投稿日時: 2002-07-26 05:09
うりゅうさん、べーちゃんさんありがとうございます。
>2.「クライアント側では」という表現の裏にある問題。 表現の裏には何の意図もありません。単に、ブラウザを意味しています。 しかし、調べた結果、ブラウザで「最新の情報に更新」コマンドを実行すると正常な表示に変わることから、おっしゃる通り、ひょっとしたらブラウザの問題かな?とも考えています。少なくとも、サーバー側からは正確な情報を送っています。ちなみに、現在の開発環境は、サーバー、ブラウザ、DB全て同じPC内に存在します。 >テーブルコントロールはポストバックの都度、 変更したテーブルの内容が初期化され、初期状態に戻る テーブルコントロールには直接リテラルを入れているわけではなく、子コントロールとしてテキストボックスと隠しタグを入れ、テキストボックスの内容を表示させています。その際、テキストボックス、隠しタグ両方ともコーディングの通りには更新されません。 以上引き続きよろしくお願いします。 |
|
投稿日時: 2002-07-26 07:02
書き方が悪かったようで、誤解を与えてしまったようですね。
>>テーブルコントロールはポストバックの都度、 変更したテーブルの内容が >>初期化され、初期状態に戻る >テーブルコントロールには直接リテラルを入れているわけではなく、 >子コントロールとしてテキストボックスと隠しタグを入れ、テキストボックスの >内容を表示させています。その際、テキストボックス、隠しタグ両方とも >コーディングの通りには更新されません。 変更したテーブルの内容が初期化されるとは内容のことだけをいっているのでは なく、列数、行数を含めた構成すべてがページロード時に元に戻ることを確か 意味していたはずです。つまりプログラムで変更したすべての要素が取り消されて デザイン時の状態に戻ると書かれていたと記憶しています。 それと、この件にぶち当たったのは実はベータを使っている段階で、今となっては ヘルプのどこだったか、あやふや、かつもしかすると私が気が付いていないうちに 製品版では仕様が変更になっている可能性があるということを書き忘れており ました。 |
|
投稿日時: 2002-07-26 13:13
私が誤解しているようなのですが、
>ところが、ポストバック後、フォームを変更してもテーブルはクライアント側では以 前の表示のままで、変更が反映されません。 と、お書きになっているのは ・列数や行数など、テーブルの構成要素そのものが全く変更されずにそのまま表示される。 ・上記は変更されているが、その中身にあたるテキストボックスなどの内容が変更されない。 どちらでしょう? ちなみにヘルプ文章名としては 「Table Web サーバー コントロールによるデータベース情報の表示」のメモには メモ Web フォーム ページに動的に追加したコントロールは、自動的にはページに表示されません。ページでサーバーへのラウンド トリップが行われるときには、コントロールもコントロールの値も保存されません。このため、動的に生成したコントロールの値を保存する場合は、コントロールの状態を保存する必要があります。詳細については、「Web フォームの状態管理の概要」を参照してください。 と、記述してあり、 「Table Web サーバー コントロールへの行およびセルの動的な追加」のメモには メモ 既定では、Web フォーム ページに動的に追加するコントロールは、ページのビューステートに追加されます。ラウンド トリップごとにコントロールを再作成する場合は、コントロールが再作成される前にビューステートが元の状態に戻るため、ページを処理するときに予測不可能な動作が起こる可能性があります。この問題を回避するには、コンテナ コントロール (Table コントロールなど) の EnableViewState プロパティを false に設定します。詳細については、「プログラムによる Web フォーム ページへのコントロールの追加」を参照してください。 となっています。このあたりが解決の鍵なのでしょうか。 _________________ -------------------------------------- ネットビルド 小田原貴樹 odahara@netbuiuld.jp -------------------------------------- |
|
投稿日時: 2002-07-26 15:56
>変更したテーブルの内容が初期化されるとは内容のことだけをいっているのではなく、列数、>行数を含めた構成すべてがページロード時に元に戻ることを確か意味していたはずです。
>・上記は変更されているが、その中身にあたるテキストボックスなどの内容が変更されない。 テーブルの中に動的にリテラルも挿入するようにして、再度調べてみました。その結果、行数、列数、リテラルの動的変更は全く問題なく意図した通りの表示に更新されました。従って、べーちゃんさんがおっしゃる通り製品版になって仕様が変更しているものと考えられます。しかし、子コントロールは以前の内容のままです。全く奇妙な現象ですね... また、「Table Web サーバー コントロールへの行およびセルの動的な追加」の記述に従って、テーブルコントロールのEnableViewStateをfalseにしても、実行時の動作は全く変わりません。ヘルプファイルの記述はベータ版のときのものでしょうか? |
|
投稿日時: 2002-07-26 18:10
みなさん、ありがとございました。
本件、なんとか解決することができました。と、いいましても、あまり気持ちのいい方法ではないんですけど... 恐らくVB.NETのバグと思われますが、テーブルコントロールの子コントロールが同じID名だと、ポストバック後も古い内容が残ってしまうようです。 そこで、毎回Rnd関数で乱数を発生させ、各子コントロールのID名の一部に組み込み、且つSession変数に乱数を記憶させておく、という方法で乗り切ることができました。 みなさん、今後ともよろしくお願いします。 |