質問: こんにちわ 開発環境は 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を変えると、テキストボックスの値が元に戻る現象が起きたのか理解できていません。よろしければ、ここについて何か意見をいただきたいので、まだ回答を受け付けます。
回答: >最初は値の変更もできたし、検証コード、ドロップダウンの内容の変更もうまく働いていました。 元は動いていたのであれば、疑うべきは変更箇所です。 コードの変更、環境の変更、それによる処理順序の変更、疑うべき点は多々あります。 >これとは関係のない要素 と思われているかもしれませんが、本当にそうでしょうか? 例えば複数の処理が並行して行われている場合、1つの処理にかかる時間が変わることでイベントの発生タイミングが変わり、処理順序がずれるなんていうことはよくあります。 ASP.NETのようにクライアント側の操作をサーバー側に通知して処理、結果をまたクライアント側に反映・・という複雑なことを複数の端末から遅延なども発生する中で行う場合は特に注意しないといけません。 >ブレークポイントをつけて一回一回止めると、ごくたまにonTextChangeイベントが走る ということからも、何らかのイベント割り込みにより他イベントのタイミングがずれた(もしくは発生しなくなった)可能性が高いです。 まずは動いていた時と動かなくなった後の変更がわかるような形でコードを提示頂かないことには的確なアドバイスは難しいと思います。