C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: GridViewの編集時DropDownList更新されない


(過去ログ 72 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■41620 / inTopicNo.1)  GridViewの編集時DropDownList更新されない
  
□投稿者/ zi_wa (5回)-(2009/09/25(Fri) 18:08:52)

分類:[.NET 全般] 

GRIDVIEWを作成し、そこにテーブルAの内容を表示させています。

・テーブルAには商品、区分名、ケース数、単価のフィールドがあり、
 区分名のフィールドのみ値がNULLの状態です。

・テーブルBには区分名のみが入っています。

 GRIDVIEWの区分名の欄を編集時DropDownlistにして、
 DropDownlistにテーブルB.区分名を表示。更新すると、選択した区分名が
 テーブルA.区分名に格納されるようにしたいと思っています。


以下作業の流れですが、
@テーブルAをGRIDVIEWで表示。編集機能を付けました。
この状態だと編集画面のときに入力ボックスが現われ、正常に入力内容が更新されています。

AGRIDVIEWの区分名の項目をTemplatefieldにし、
 Templateの編集で、区分名のEdititemTemplateにテーブルBのSqldatasourceを設定し、
 それに関連づけたDropDownlistを設定しました。
 *Selectedvalueには何も書き込んでいません


BテーブルA.区分名がNULLのためそのままだと「SelectedValuのプロパティーが一覧にありません。」と出る為
 .VBに以下を書き込みました。

Protected Sub DropDownListCommentKbn_DataBound(ByVal sender As Object, ByVal e As EventArgs)
Dim ddl As DropDownList = DirectCast(sender, DropDownList)
Dim li As ListItem

li = New ListItem("(選択)", "")
ddl.Items.Insert(0, li)

Dim dtv As DetailsView = DirectCast(ddl.NamingContainer, DetailsView)

If dtv.DataItem IsNot Nothing Then

Dim com_kbn_mei As String = DirectCast(dtv.DataItem, DataRowView)("KBN_MEI").ToString()

ddl.ClearSelection()

li = ddl.Items.FindByValue(com_kbn_mei)

If li IsNot Nothing Then
li.Selected = True

End If

End If
End Sub

C編集画面にすると、意図した通り、GRIDVIEWの区分名の欄がDropDownlistになり、
 DropDownlistにテーブルB.区分名が表示されていました。


ここまできたのですが、いざ更新ボタンをクリックしても、テーブルA.区分名には何も格納されません。
GRIDVIEWの他の項目欄(DropDownlistにした区分名以外)は入力ボックスのままなのですが、
これらは入力内容が更新されています。

バインドされない?からでしょうか。
アドバイスよろしくお願い致します。

引用返信 編集キー/
■41630 / inTopicNo.2)  Re[1]: GridViewの編集時DropDownList更新されない
□投稿者/ もりお (90回)-(2009/09/26(Sat) 06:27:41)
No41620 (zi_wa さん) に返信
> バインドされない?からでしょうか。

おそらくそうだと思います。
GridView の RowUpdating イベントで値をセットしてみてはいかがでしょうか。

[コラム]データソース・コントロールに動的にパラメータを引き渡す
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_04/vs2005db_04_03.html

引用返信 編集キー/
■41700 / inTopicNo.3)  Re[2]: GridViewの編集時DropDownList更新されない
□投稿者/ zi_wa (6回)-(2009/09/28(Mon) 18:44:07)
No41630 (もりお さん) に返信
もりおさん、ご返信ありがとうござます。URLの内容ですが、
Evalメソッドを用いたGridView.RowUpdatingイベントの説明があるのですが、

Selectedvalueにeval("KBN_MEI")と入力すると テーブル.AがNULLのため、エラーとなります。
そのため現在Selectedvalueに何も入れてない状態です。

.VB の Protected Sub DropDownListCommentKbn_DataBound(ByVal sender As Object, ByVal e As EventArgs)
のなかでバインドさせるのでしょうか・・。

もう少し試してみます。
引用返信 編集キー/
■41704 / inTopicNo.4)  Re[3]: GridViewの編集時DropDownList更新されない
□投稿者/ もりお (92回)-(2009/09/28(Mon) 21:25:19)
No41700 (zi_wa さん) に返信
> Evalメソッドを用いたGridView.RowUpdatingイベントの説明があるのですが、

更新データが自動的にセットされないという意味では Eval を使った場合も
zi_wa さんのやり方も同じとみなせるように思います。
No41630 のリンク先のコラムは「Eval メソッドを利用した場合にも」という書き出しで始まっていますが
「バインドしない場合にも」と読み替えてください。

こんな具合で更新できるかと思います。
Protected Sub GridView1_RowUpdating( ...
    e.NewValues("KBN_MEI") = 更新値
End Sub

引用返信 編集キー/
■41797 / inTopicNo.5)  Re[4]: GridViewの編集時DropDownList更新されない
□投稿者/ zi_wa (7回)-(2009/09/30(Wed) 18:14:15)
もりおさん
いつもありがとうございます。

e.NewValues("KBN_MEI") = 更新値
で更新されなかった為、とりあえず区分名の項目がNULLである部分や
DropDownlistにテーブルB.区分名を表示するなどを全部考えないようにして、
とりあえずURLの内容に沿って、Evalメソッドを利用してデータを更新するというシンプルな
ソースを作ってみました。


GRIDVIEWを作成し、そこにテーブルAのデータ(商品、区分名、ケース数、単価)を表示
テーブルA.区分名のデータを編集時DropDownListで選択できるように設定
 ・GRIDVIEWの区分名の項目をTemplatefieldにし、
  右クリック→DataBindingsの編集→SELECTEDVALUEに EVAL("KBN_MEI")を入力
 *テスト用に区分名のデータにNULLはない状態にしました

.VBに以下を追加
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)

' 更新対象行をGridViewRowオブジェクトとして取得
Dim row As GridViewRow = GridView1.Rows(e.RowIndex)

' 行に含まれる個々のコントロールを取得
Dim strKBN_MEI As DropDownList _
= DirectCast(row.FindControl("KBN_MEI"), DropDownList)

e.NewValues("KBN_MEI") = strKBN_MEI.SelectedValue

End Sub


動作を確認したところ、表示は問題無いのですが、
編集画面で区分名のデータをDropDownListで変更しても、更新されない状態です。

ちなみにDataBindingsの編集→SELECTEDVALUEに BIND("KBN_MEI")にすると更新されます。
なぜ更新できないのか、悩んでおります。

アドバイス頂けたらよろしくお願いします。。

引用返信 編集キー/
■41820 / inTopicNo.6)  Re[5]: GridViewの編集時DropDownList更新されない
□投稿者/ もりお (93回)-(2009/09/30(Wed) 21:27:34)
2009/09/30(Wed) 21:31:26 編集(投稿者)

No41797 (zi_wa さん) に返信
> 動作を確認したところ、表示は問題無いのですが、
> 編集画面で区分名のデータをDropDownListで変更しても、更新されない状態です。
> ちなみにDataBindingsの編集→SELECTEDVALUEに BIND("KBN_MEI")にすると更新されます。

BIND("KBN_MEI")で更新されるとなりますと、列名が間違っているということは
なさそうですね。
もしかして、オプティミスティックな同時実行制御をされていますでしょうか?
引用返信 編集キー/
■41844 / inTopicNo.7)  Re[6]: GridViewの編集時DropDownList更新されない
□投稿者/ zi_wa (8回)-(2009/10/01(Thu) 11:59:48)
もりお さん
すみません、度々ありがとうございます。

オプティミスティックな同時実行制御をしていました
のでデフォルト値 ConflictDetection="OverwriteChanges"
に戻したのですが、やはり現象は変わりません。

ソースを見直したところ、今回の GridView1_RowUpdatingの他に
編集時の GridView1_PreRenderイベントがあります。
ListBoxで複数選択後し、GRIDVIEW編集をした時に、
ボタンのクリックイベントで SelectCommand の値をセッションに保存して、
GridView の PreRender イベントで読み出した部分です。

このせいでしょうか。

'GRIDVIEW 編集ボタン押下したときのサーバー側イベント処理
Protected Sub GridView1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.PreRender
If Session("selectString") Is Nothing Then
Exit Sub
End If
' 読み出し
SqlDataSource1.SelectCommand = DirectCast(Session("selectString"), String)
End Sub


Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)
' 更新対象行をGridViewRowオブジェクトとして取得
Dim row As GridViewRow = GridView1.Rows(e.RowIndex)
' 行に含まれる個々のコントロールを取得
Dim strKBN_MEI As DropDownList _
= DirectCast(row.FindControl("KBN_MEI"), DropDownList)
e.NewValues("KBN_MEI") = strKBN_MEI.SelectedValue

End Sub


引用返信 編集キー/
■41848 / inTopicNo.8)  Re[7]: GridViewの編集時DropDownList更新されない
□投稿者/ もりお (94回)-(2009/10/01(Thu) 13:54:33)
2009/10/01(Thu) 14:06:49 編集(投稿者)
No41844 (zi_wa さん) に返信
> オプティミスティックな同時実行制御をしていました
> のでデフォルト値 ConflictDetection="OverwriteChanges"
> に戻したのですが、やはり現象は変わりません。

SqlDataSource の ConflictDetection プロパティを OverwriteChanges に変えただけでは
UpdateCommand の SQL は修正されなかったような記憶があります。
データソースの構成を行わないといけなかったような気がします。
original なパラメータを期待するような SQL のままではないかデザイナのソース表示で
確認してみてください。


さて、オプティミスティックな同時実効制御を行う場合の更新なのですが
デザイナが自動的に生成する SQL を見ていただくとわかりますが、各列の値が元の値と同一
かを比較するために元の値もパラメータとして渡さなければいけないようです。

GridView の RowEditing イベントで元の値を ViewState に保存し
RowUpdating イベントで取り出して OldValues にセットするとよさそうです。

Protected Sub GridView1_RowEditing( ...
    Dim labelKBN_MEI As Label = DirectCast( _
        GridView1.Rows(e.NewEditIndex).FindControl("LabelKBN_MEI"), Label)

    ViewState("original_KBN_MEI") = labelKBN_MEI.Text
End Sub

Protected Sub GridView1_RowUpdating( ...
    e.OldValues("KBN_MEI") = ViewState("original_KBN_MEI")
    e.NewValues("KBN_MEI") = ...
End Sub

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -