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

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

ただいまの
回答率

90.50%

  • VB.NET

    1059questions

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

  • ASP.NET

    627questions

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

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,653

daikun

score 1

こんにちわ
開発環境は
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を変えると、テキストボックスの値が元に戻る現象が起きたのか理解できていません。よろしければ、ここについて何か意見をいただきたいので、まだ回答を受け付けます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/10 16:14

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

    キャンセル

  • 2016/06/10 16:17

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

    キャンセル

  • 2016/06/10 16:22

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

    キャンセル

  • 2016/06/10 16:25

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

    キャンセル

  • 2016/06/10 16: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で走りません。値が元に戻ってしまうので、走らないのだと思います。

    キャンセル

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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 17:38

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

    キャンセル

同じタグがついた質問を見る

  • VB.NET

    1059questions

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

  • ASP.NET

    627questions

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