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

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

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

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

3回答

11610閲覧

GridViewに設置したテキストボックスを変更しようとしても元に戻ってしまう。

daikun

総合スコア7

ASP.NET

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/06/10 06:59

編集2022/01/12 10:55

こんにちわ
開発環境は
Visual studio 2008
asp.net VB
です。

問題の前に、今つくっているものの紹介をします。
GridViewのItemTemplateにテキストボックスを入れています。またほかの列にドロップダウンリストを入れています。
テキストボックスの内容が変更されたら値の検証をし、そして内容に応じて別の列の同じ行のドロップダウンリストの内容を変更するために、OnTextChangeイベントハンドラにおいて検証のコードとドロップダウンリストの変更のコードをVBで書いています。autoPostBackはTrueにしています。

Gridviewへは非ポストバック時にデータベースからデータを持ってきてDataTableをバインドしています。

GridViewのRowCreatedイベントでテキストボックスのIDにrowIndexを付加しています。

こういったものを作っているのですが、問題が起きました。
GridViewのテキストボックスの値を変更してフォーカスを外すと、postBackが起きますが、テキストボックスの値が、変更前のものに戻ってしまうのです。そしてonTextChangeイベントが起きません。

この問題は最初はありませんでした。最初は値の変更もできたし、検証コード、ドロップダウンの内容の変更もうまく働いていました。これとは関係のない要素を作っているうちに、いつのまにか値の変更ができなくなっていました。またこの問題が起こった後のことですが、RowCreatedイベントにブレークポイントをつけて、一回一回止めると、ごくたまに、値が変更できて、onTextChangeイベントが走ることがあります。

どうしてGridViewのテクストボックスの値を変更した後のpostBackの後、値が元に戻ってしまうようになったのかについて、わかるかたがいらっしゃいましたら、教えていただきたく思います。

テキストボックスの変更後の値でViewStateが上書きされないという現象が起こっているのかなとも思うのですが、ご意見をいただきたく思います。

postBack後にGridViewへのデータベースからとってきたデータのデータバインドは発生していないことを確認しております。

追記
自己解決?と呼べるかどうかはわかりませんが、textBoxの値を変更してからpostBackが起こると元の値に戻らないようにすることができました。

GridViewのRowCreatedイベントでテキストボックスやドロップダウンリストのIDをrowindexを付加したものに変更していたのですが、これをやめて、aspxに書かれたIDのままにしておくと、値が元に戻る現象がなくなりました。

イベントが発生したテキストボックスがどの行なのかを取得するためにrowindexを付加したIDに変えていたのですが、これをやめて、ClientIDから行番号を取得する方法に変えたらうまくいきました。

しかし、なぜ、テキストボックスやドロップダウンリストのIDを変えると、テキストボックスの値が元に戻る現象が起きたのか理解できていません。よろしければ、ここについて何か意見をいただきたいので、まだ回答を受け付けます。

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

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

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

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

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

guest

回答3

0

自己解決されたようなので、残っている疑問点の参考になるかもしれないことを記述します。

まずPostBackされたときにブラウザから送られてきたデータは、以下のようにしてRequest.Formコレクションの内容を表示すれば確認できます。

VB.Net

1For Each key As String In Request.Form.Keys 2 Dim value As String = Request.Form(key) 3 If value Is Nothing Then 4 value = "<Nothing>" 5 End If 6 Debug.WriteLine(key.ToString & ControlChars.Tab & value) 7Next

keyの部分がブラウザに表示された inputタグの name属性の値になります。
valueの部分がinputタグに入力された文字列になります。

ブラウザから送られてきたデータは UniqueIDプロパティの値が name属性の値 と同じTextBoxを探してセットされます。

(ちなみに TextBoxの UniqueID は通常 ID と同じですが、MasterPageを使っていると ID の頭に
MasterPage の ID やら ContentPlaceHolderID やら付加された値になります)

なので初回表示時とPostBack時で UniqueIDプロパティの値が異なっていると、ブラウザから送られてきたデータがTextBoxにセットされません。

あと、ブラウザから送られてきたデータがTextBoxにセットされるタイミングは、Page.InitCompleteイベント終了後で、Page.PreLoadイベント開始前です。

TextBoxを動的に生成している場合は、Page.Initイベント か Page.InitCompleteイベント の中で TextBoxの生成・IDの設定・コントロールをコンテナ(PageやGridViewなど)へ追加するなどを終わらせておかないと、ブラウザから送られてきたデータがTextBoxにセットされません。

投稿2016/06/13 08:02

編集2016/06/13 08:34
twck

総合スコア314

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

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

daikun

2016/06/13 08:38

丁寧なご回答まことにありがとうございます。 熟読して、今回の問題について調査を実施したいと思います。
guest

0

>最初は値の変更もできたし、検証コード、ドロップダウンの内容の変更もうまく働いていました。
元は動いていたのであれば、疑うべきは変更箇所です。
コードの変更、環境の変更、それによる処理順序の変更、疑うべき点は多々あります。

>これとは関係のない要素
と思われているかもしれませんが、本当にそうでしょうか?

例えば複数の処理が並行して行われている場合、1つの処理にかかる時間が変わることでイベントの発生タイミングが変わり、処理順序がずれるなんていうことはよくあります。
ASP.NETのようにクライアント側の操作をサーバー側に通知して処理、結果をまたクライアント側に反映・・という複雑なことを複数の端末から遅延なども発生する中で行う場合は特に注意しないといけません。

>ブレークポイントをつけて一回一回止めると、ごくたまにonTextChangeイベントが走る
ということからも、何らかのイベント割り込みにより他イベントのタイミングがずれた(もしくは発生しなくなった)可能性が高いです。

まずは動いていた時と動かなくなった後の変更がわかるような形でコードを提示頂かないことには的確なアドバイスは難しいと思います。

投稿2016/06/13 03:25

編集2016/06/13 03:26
jawa

総合スコア3013

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

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

0

手元に環境がなく、ASP.NETを触っていたのも随分前なのであまり覚えてないんですが、下記サイトのようなことをやればpostBack対策になるのではと思います。
http://hensa40.cutegirl.jp/archives/842

投稿2016/06/10 07:10

ttyp03

総合スコア16996

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

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

daikun

2016/06/10 07:14

非ポストバック時のみ(つまり初回の呼び出しのみ)SqlSeverから取得したDataTableをGridViewにバインドするという処理はやっています。
ttyp03

2016/06/10 07:17

そうですか。 では関連しそうな箇所のソースを提示した方がよいかもしれませんね。
daikun

2016/06/10 07:22

すみません、値の変更ができていたものが、突然できなくなり、どこがおかしいのか自分でまったくわからず、関連しそうな個所もわかりません。値の変更ができていたものはバックアップを取っておらずコードを失ってしまいました。コンパイルされたものはあるのですが。
ttyp03

2016/06/10 07:25

関連しそうなところと言えば、最初に回答したPage_Loadイベント、あとはテキストボックスのロストフォーカスあたりじゃないですか?
daikun

2016/06/10 07:35

page_Loadイベントは省略しましたが以下のような感じです。 selSqlとはSqlServerからデータをとってきてGridViewにバインドする関数です。 マスターページをつかっていてマスターページのパラメータを設定するコードがあります。 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Master.HtmlTitle = "××" Master.HeaderView = True Master.FooterView = False Master.LinkView = False 'タブOFF If Not IsPostBack Then If Master.intPermission = 1 Then '会社IDの場合 '最初は編集モード editMode = 1 Call selSql() Else '支店IDの場合 '最初は編集モード editMode = 1 Call selSql() End If End If End Sub テキストボックスのロストフォーカスというのはよくわかりません。 onTextChangeイベントのコードは長いし恥ずかしいので乗せたくないです。 またOnTextChangeイベントはテキストボックスの値変更後のpostbackで走りません。値が元に戻ってしまうので、走らないのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問