- PR -

値の変更をデータグリッドへ反映させる方法

投稿者投稿内容
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-01-15 19:06
現在ASP.NETでWebアプリを作っているのですが、Form上のテキストボックスの値を変更したらデータグリッドの値も変更されるようにしたいと思っています。
テキストボックスをHTMLコントロールにすればonchangeイベントなどが使えますが、この場合データグリッド上の値を変更する方法が分からないでいます。

お手数ですが何卒宜しくお願いいたします。

VS.NET2003 + Win2000Serverです。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-01-15 19:32
サーバに一度データをなげて、データを書き換える、という
方法をとるか、クライアント側でDHTMLでスクリプトでデータを
書き換える、という方法をとるか、どちらがやりたいのでしょうか。

#スクリプトでデータを書き換えるのは、データグリッドが
 自動的に生成されていることを考えると面倒そうだけど。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-15 20:06
引用:

烏龍さんの書き込み (2004-01-15 19:06) より:

テキストボックスをHTMLコントロールにすればonchangeイベントなどが使えますが、


 HTMLコントロールでなくても、OnChangeイベントは使えます。サーバに持ってくる方法と、クライアントで処理する方法、どちらもあります。

 が、小野さんがおっしゃるように、クライアントではDataGrid内のアイテムを特定するのが難しいので、サーバで行う方が楽でしょう。ところが、OnChangeで行うと、1文字入力するごとにサーバとのやり取りがあるため、実用的ではありません。さて、どうしましょう?
無月 重造
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 67
投稿日時: 2004-01-16 10:19
初めまして。無月と言います。以後よろしくお願いします。

この問題は自分も昔少し悩みまして
そのときにTextBoxのAutoPostBackをtrueにするという方法で乗り切った記憶があります。

が、
・値を変えてもほかのコントロールに移動しない限りポストバックが起きない、
・一回一回値を変えるたびにポストバックする
この2点のせいでいまいちかな、と思いましたが。

冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2004-01-16 11:13
.Netは使ってないんですが、似たようなコンセプトのアプリを作った覚えがあるので返答を・・・

うちでやってみたのは、
「変更のあったフォームを隠しフォームをポストして、最後にフォームを取得した時間からデータベースの変更があった場合、そのフォームの内容をJavaScriptで変更する」
という方法でした。
具体的には、
コード:

<form>
<input type=text name=変更のあったフォーム value=内容</form>
</form>


という内容を隠しフレームにJavaScriptで書き出して、
コード:

<script>
window.frames.mainform.document.forms[データベースとの差分があったフォーム].value=内容;
</script>


ってな感じで隠しフレームに返ってくるイメージで・・・
で、実際にやってみた感じは、
・スクリプト量が多くなるので、最初のロードに時間がかかる
・コードが必然的に複雑になる
・クライアントによってスピード、挙動が変わる
などの問題が面倒なんで、それ以来、こういうアプローチは使わなくなりました^^;

※それからしばらくして、OpenThoughtというのを見つけました。似たような事を考える人はいるもんだ


[ メッセージ編集済み 編集者: 冬寂 編集日時 2004-01-16 11:15 ]
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-01-16 13:18
皆様レスありがとうございます。

とりあえずTextBoxのAutoPostBack="True"に設定し、OnTextChangedハンドラ内でデータグリッドを更新してうまく出来ました。

ただデータグリッド内にTextBoxを配置した場合に問題が出ました。
ItemTemplateを使ってCell内にTextBoxを配置しているのですが、TextChangedイベントが発生せず、しかもViewStateを有効にしてても入力した値がポストバック時に消えてしまいます。

作り方が悪いのかもしれませんが、この場合はどのように行えば良いのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-16 13:35
引用:

烏龍さんの書き込み (2004-01-16 13:18) より:

ItemTemplateを使ってCell内にTextBoxを配置しているのですが、TextChangedイベントが発生せず、しかもViewStateを有効にしてても入力した値がポストバック時に消えてしまいます。


 DataGridへのデータバインドを、どこで、どのように、行っていますか?

 例えば、Page_Loadイベントハンドラで、次のようにしていると、そのようになります。
>>>>>
イベントハンドラ
 データを持ってくる
 データグリッドにバインド
イベントハンドラ終わり
<<<<<
次のようにすると、回避できます。
>>>>>
イベントハンドラ
 もし、ポストバックでないなら
  データを持ってくる
  データグリッドにバインド
 もし終わり
イベントハンドラ終わり
<<<<<
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-01-16 14:59
Jittaさん、ありがとうございます。

教えて頂いた通り、Page_Load内にて

>>>>>
イベントハンドラ
 もし、ポストバックでないなら
  データを持ってくる
  データグリッドにバインド
 もし終わり
イベントハンドラ終わり
<<<<<

と記述することで完全にうまくいきました。
結局のところポストバック時に毎回データグリッド
を初期化していたのが問題でした。
簡単なことに気づかずお手数をおかけしました。

最後にご親切にレスを書いていた頂いた皆様
本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)