トップ回答者
ASP.NETのGridViewで編集するためにDropDownListを使い値を選択したのですが、SQL UPDATEのフィールドへ選択した値を指定する方法

質問
-
ASP.NET でGridViewを使いSQL Serverのテーブルを表示させるページを作成しています。
このGridViewに表示するDBのテーブルの中に、別テーブルの値と関係づけている列があります。
例えば以下のようなテーブルです。
Table1(field1,field2,field3,field4)
field3は、Table2に詳細な情報を持つTableの外部キーになっています。
Table2(field3, fieldXXX)
GridViewでは、Table1のfield3以外はそのまま表示し、field3は、Table2のfieldXXX部分を表示します。
GridViewの編集時の動作としては、field3部分はDropDownListで選択できるようにしています。
以下のように定義しています。
<asp:TemplateField HeaderText="Area Name" SortExpression="area_name">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="SQLDataSource2"
DataTextField="area_name"
DataValueField="area_id"
AutoPostBack="True"
SelectedValue='<%# Bind("area_id") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("area_name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
更新の際に、SQL文を
UpdateCommand="UPDATE Customers SET customer_name =@customer_name, area_id=@area_name, comment = @comment WHERE (customer_id = @customer_id)">
DlopDownListで選択した結果をarea_idに渡したいのですが、area_id=@xxxxxx の書き方がわかりません。
DropDownListを除けば更新もできるのですが、DlogDownListの表示も更新時のみ表示できるのですが、
どのように記述すればよいか、ご助言いただけないでしょうか。
Reiji Tanaka
回答
すべての返信
-
全体が見えないので、ひょっとしたらハズレかもしれませんが・・・
> DlopDownListで選択した結果をarea_idに渡したいのですが、area_id=@xxxxxx の書き方がわかりません。
SqlDataSource と GridView を組み合わせ使っているのであれば、GridView.RowUpdating イベントのハンド
ラで DropDownList.SelectedValue を取得して、それを一旦保持しておき、SqlDataSource.Updating イベン
トのハンドラで SqlCommand のパラメーターに設定してやればうまくいくと思います。以下のような感じです。
string selectedValue;
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridView1.Rows[e.RowIndex];
DropDownList ddl = (DropDownList)row.FindControl("DropDownList1");
selectedValue = ddl.SelectedValue;
}protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
SqlCommand command = (SqlCommand)e.Command;
command.Parameters["@area_name"].Value = selectedValue;
} -
> GridView での基本データの編集
> http://msdn.microsoft.com/ja-jp/library/ms972948.aspx
そのサンプルでは更新できないようですが?
-------------------------------------
追伸です。
更新できないのは、UpdateCommand の問題のようです。以下の部分を修正したら更新で
きるようになりました。
WHERE [ProductID] = @original_ProductID"
↓
WHERE [ProductID] = @ProductID"
自分が先のレスで書いたようなコードは不用で、SelectedValue='<%# Bind("CategoryID") %>'
というように Bind を使えば更新可能でした。
Reiji さんがアップされたコードは Bind を使っていますが、とすると、その部分には問題はな
く、上記と同様に UpdateCommand の問題でしょうか?- 編集済み SurferOnWww 2009年12月6日 5:18 追伸
-
SurferOnWww さん
ご助言いただきありがとうございました。
いろいろためしたのですが、なぜかうまくいきませんでした。
私の理解が、中途半端なせいなのですいません。
ただ、結局のところ、複数のDBのTableに分割されたデータを、ドロップダウンListで選択して、更新することはできました。
要点:
1)DBをリレーションを確立しておく
2)Selectで取得するとき、外部キーで参照されるテーブルにある、表示させたいデータも合わせて取得
(GridView的には、外部キーのフィールドと参照先のレコードのデータを、それぞれ定義しました)
3)GridViewに定義した、外部キーのフィールドは非表示にする
4)GripViewに定義した、外部キーで参照されるテーブルの表示させたいデータをTemplateFieldに定義する
5)4)で定義したTemplateFieldのEditItemTemplateに、ドロップダウンリストを定義し、そのデータソースの定義を、
外部キーで参照されるテーブルを割り当てる
このようなことで、とりあえずできました。
この方法は、trapemiya さん に紹介されたページに説明されていることを参考にさせていただきました。
ありがとうございました。
Reiji Tanaka