- PR -

【ASP.NET2.0】GridView更新時、非Bind列の値がnullになる

1
投稿者投稿内容
すけじい
会議室デビュー日: 2003/08/26
投稿数: 19
投稿日時: 2006-07-21 19:42
前回の質問ではお世話になりました。
で、さっそくGridViewの質問です。
GridViewコントロールをSqlDataSouceコントロールにバインドし、うまくいきました。

1.GridViewに<asp:TemplateField>を配置し、<asp:Textbox Text='<%# Bind("hoge") %>' />などでキー入力値をデータソースにバインドしています。
2.<asp:ButtonField commandname="update">で、行更新を行うボタンを作りました。
3.GridViewHoge.RowCommandイベントをフェッチし、ハンドラで受けました。
4.GridViewHoge.UpdateRow(行数,バリ是非)で行更新できました。

しかしここで、例えば元データに10個のフィールドがあり、GridViewでそのうち5個にバインドが当たっているとすると、更新時、残りの非バインドなフィールドがnullになります(大泣)。

DetailsView、FormViewすべて同動作なので、僕のやりかたがマズいのだと思います。
Repeater/DataList/DataViewと挙動が異なるため難儀しています。
お助けを!

_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-07-21 20:15
引用:
しかしここで、例えば元データに10個のフィールドがあり、GridViewでそのうち5個にバインドが当たっているとすると、更新時、残りの非バインドなフィールドがnullになります(大泣)。

「nullになります」はデータベースでって意味ですか?
DataSourceのUpdateQueryはどうなっていますかね。非バインドなフィールドの値も
更新するようなクエリになっちゃっていませんかね。
すけじい
会議室デビュー日: 2003/08/26
投稿数: 19
投稿日時: 2006-07-21 20:40
> べる さん
毎度ありがとうございます。

ああああっ! リプライを一目見た瞬間に理解しました。
SqlDataContorlのUpdateQueryが……自動生成だと、(当然ながら)全フィールドを更新に行っていました。
Keyフィールドが非バインドにもかかわらず正常に更新されているのが奇怪なのですが、納得できます。

でも、ご免なさい。ちょっと質問の趣旨が悪かったのですが、もし、「非バインド列に任意の値を投入したい」としたら、どういう事になるでしょうか?
更新するデータ内容によって、複数のフィールド値に値をプログラマブルに設定したいことはよくあることなので。。。
<Hidden>なバインド列を作っておいて、値を埋めるのは、ちょっと抵抗があります。
できれば、GridView.Row(XX).Update()の前に、
GridView.Row(XX).Values("home") = XXXとかしておけたらうれしいのですが。。
_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-07-21 21:22
引用:
でも、ご免なさい。ちょっと質問の趣旨が悪かったのですが、もし、「非バインド列に任意の値を投入したい」としたら、どういう事になるでしょうか?
更新するデータ内容によって、複数のフィールド値に値をプログラマブルに設定したいことはよくあることなので。。。

GridViewのRowUpdatingイベントのハンドラの中で
e.NewValues["列"] = "任意の値";
とかしてます。これが正攻法なのかいまいちつかめてないんですが。
すけじい
会議室デビュー日: 2003/08/26
投稿数: 19
投稿日時: 2006-07-23 11:52
> べるさん ありがとうございます。
返信いただいてからずっとテストして、あー! やっと理解できました。

僕の状況では、以下のように理解できました。
1.TemplateFieldに通常の<ASP:Button>を置いた場合、ButtonFieldにボタンを作った場合、どちらの場合でも、GridViewHoge.ButtonCommandイベントが起きる
2.しかしこのイベント中は、送信側のGridViewRowのDataItemがNothingで、行内容を取得できない(行のIndex#は取得可能)。
3.行内容の取得と設定は、行更新直前のGridViewHoge.RowUpdatingイベントにおいて、NewValueコレクションで行う。
4.挿入時も、RowInsertingイベントで同様のことが可能

これ、WindowsFormsのGridControlでは常識的なことだったようですね……お恥ずかし
WebFormsでは、DataSourceControlが出るまで、Updateサポートのグリッドがなかったから、仕方ないですよね。
さっそく、作りかけのRepeaterなTableをGridViewに書き直します。

本当に感謝したします。

_________________
1

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