none
ASP.NETのGridViewで編集するためにDropDownListを使い値を選択したのですが、SQL UPDATEのフィールドへ選択した値を指定する方法 RRS feed

  • 質問

  • 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
    2009年12月5日 8:56

回答

すべての返信

  • 全体が見えないので、ひょっとしたらハズレかもしれませんが・・・

    > 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;
    }

    2009年12月5日 12:47
  • 以下のページの一番最後に載っているようなことがされたいように受け取れるのですが、合っていますでしょうか?

    GridView での基本データの編集
    http://msdn.microsoft.com/ja-jp/library/ms972948.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Reiji 2009年12月7日 7:12
    2009年12月6日 0:48
    モデレータ
  • > 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 追伸
    2009年12月6日 4:30
  • trapemiya さん

    ご紹介いただいたページの最後のものがやりたいこと、そのものでした。
    ありがとうございました。
    Reiji Tanaka
    2009年12月7日 7:12
  • SurferOnWww さん

    ご助言いただきありがとうございました。
    いろいろためしたのですが、なぜかうまくいきませんでした。
    私の理解が、中途半端なせいなのですいません。

    ただ、結局のところ、複数のDBのTableに分割されたデータを、ドロップダウンListで選択して、更新することはできました。

    要点:
    1)DBをリレーションを確立しておく
    2)Selectで取得するとき、外部キーで参照されるテーブルにある、表示させたいデータも合わせて取得
       (GridView的には、外部キーのフィールドと参照先のレコードのデータを、それぞれ定義しました)
    3)GridViewに定義した、外部キーのフィールドは非表示にする
    4)GripViewに定義した、外部キーで参照されるテーブルの表示させたいデータをTemplateFieldに定義する
    5)4)で定義したTemplateFieldのEditItemTemplateに、ドロップダウンリストを定義し、そのデータソースの定義を、
      外部キーで参照されるテーブルを割り当てる

    このようなことで、とりあえずできました。
    この方法は、trapemiya さん に紹介されたページに説明されていることを参考にさせていただきました。

    ありがとうございました。
    Reiji Tanaka
    2009年12月7日 7:23