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

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

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

Re[3]: 動的に配置したドロップダウンリストから値を取得したい


(過去ログ 50 を表示中)

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

■27453 / inTopicNo.1)  動的に配置したドロップダウンリストから値を取得したい
  
□投稿者/ うず (1回)-(2008/11/06(Thu) 10:31:20)

分類:[ASP.NET (C#)] 

2008/11/06(Thu) 13:19:28 編集(投稿者)
2008/11/06(Thu) 13:18:47 編集(投稿者)
2008/11/06(Thu) 13:12:18 編集(投稿者)

現在、Visual Studio 2008 Professional Editionを使って開発しています。
ASP.NET(C#)でわからないところがありますので教えてください。

GridViewを配置し、データベースから取得したデータを表示させています。
GridView左端にCommandField列(編集、更新、キャンセルボタン)を設け、
DataGrid上でデータの編集・更新が行なえるようにしたいです。

やりたいこととしては、GridView「編集」ボタン押下時にテキストボックスを隠し、
動的に配置したドロップダウンリストからユーザに値を選ばせます。
GridView「更新」ボタン押下時には、ドロップダウンリストから値を取得したいです。
現在、そのドロップダウンリストを見つけることが出来ずにいます。

DropDownList ddlItemName = (DropDownList)GridView1.Rows[e.RowIndex].Cells[2].FindControl("ddlItem1");    
FindControlメソッドで検索してもnullが返る状態です。
(デバッグ時に確認したところ、セル上のコントロール数は、1と認識されています。)
動的にドロップダウンリストを配置する方法が誤っているのでしょうか。
お分かりになる方教えてください。よろしくお願いします。


[ソースコード] 
    DataTable m_dt = new DataTable();
    DropDownList m_ddl = new DropDownList();
    DataTable m_ddldt = new DataTable(); // DropDownList用データテーブル

    protected void Page_Load(object sender, EventArgs e)
    {
        // データバインド
        m_dt.Columns.Add("注文ID");
        m_dt.Columns.Add("商品名");

        DataRow drAdd;
        drAdd = m_dt.NewRow();
        drAdd["注文ID"] = "01";
        drAdd["商品名"] = "トマト";
        m_dt.Rows.Add(drAdd);

        drAdd = m_dt.NewRow();
        drAdd["注文ID"] = "02";
        drAdd["商品名"] = "玉ねぎ";
        m_dt.Rows.Add(drAdd);

        GridView1.DataSource = m_dt;
        GridView1.DataBind();

        // DropDownList用データテーブルを作る
        m_ddldt.Columns.Add("商品名");
        m_ddldt.Columns.Add("価格");

        DataRow drAdd2;
        drAdd2 = m_ddldt.NewRow();
        drAdd2["商品名"] = "トマト";
        drAdd2["価格"] = 80;
        m_ddldt.Rows.Add(drAdd2);

        drAdd2 = m_ddldt.NewRow();
        drAdd2["商品名"] = "玉ねぎ";
        drAdd2["価格"] = 30;
        m_ddldt.Rows.Add(drAdd2);

        drAdd2 = m_ddldt.NewRow();
        drAdd2["商品名"] = "キャベツ";
        drAdd2["価格"] = 100;
        m_ddldt.Rows.Add(drAdd2);

        drAdd2 = m_ddldt.NewRow();
        drAdd2["商品名"] = "人参";
        drAdd2["価格"] = 70;
        m_ddldt.Rows.Add(drAdd2);
    }
    
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {        
        // 編集を可能にする
        GridView1.EditIndex = e.NewEditIndex;

        string strColData1 = GridView1.Rows[e.NewEditIndex].Cells[1].Text;
        string strColData2 = GridView1.Rows[e.NewEditIndex].Cells[2].Text;

        GridView1.DataSource = m_dt;
        GridView1.DataBind();

        m_ddl.ID = "ddlItem1";
        m_ddl.DataSource = m_ddldt;
        m_ddl.DataTextField = "商品名";
        m_ddl.DataValueField = "価格";
        m_ddl.DataBind();

        // DropDown
        ListItem lstItem = m_ddl.Items.FindByText(strColData2);
        lstItem.Selected = true;
        GridView1.Rows[GridView1.EditIndex].Cells[2].Controls[0].Visible = false;
        GridView1.Rows[GridView1.EditIndex].Cells[2].Controls.Add(m_ddl);
    }
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridView1.EditIndex = -1;
        GridView1.DataSource = m_dt;
        GridView1.DataBind();
    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string strID = ""; // 注文ID
        string strItemName = ""; // 商品名
        string strItemValue = ""; // 価格
        
        // データの取得
        TextBox tbID = (TextBox)GridView1.Rows[e.RowIndex].Cells[1].Controls[0];
        strID = tbID.Text;

        // ↓ ここでddlItemNameにnullが入ります(グリッド上のDropDownListコンポーネントを取得することが出来ません)
        DropDownList ddlItemName = (DropDownList)GridView1.Rows[e.RowIndex].Cells[2].FindControl("ddlItem1");
        
        // ※ ここでDropDownListで選択されたItemのSelectIndexとSelectValueを取得したいです
                
        GridView1.EditIndex = -1;
        GridView1.DataSource = m_dt;
        GridView1.DataBind();
    }

引用返信 編集キー/
■27454 / inTopicNo.2)  Re[1]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ 純@WAS (21回)-(2008/11/06(Thu) 12:08:22)
ぱっと見なので、正しいか解りませんが(私はこの手法の経験が無いので…)
エラーを見ると、コントロールIDが取得されていないようにも見えます。

DropDownList ddlItemName = (DropDownList)GridView1.Rows[e.RowIndex].Cells[2].FindControl("ddlItem1");

ここで、ddlItem1というコントロールは存在しませんと返しているのかも知れません。
それでソースもぱっと見ですが…

追加したドロップダウンリスト
DropDownList m_ddl = new DropDownList();
に対してIDが割り振られていないだけかもしれません。

なので、追加する前に
m_ddl.ID = "ddlItem1";
を追加して現象が改善するかご確認下さい。

すでにIDを登録されている場合はスルーして下さい。
引用返信 編集キー/
■27455 / inTopicNo.3)  Re[2]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ うず (2回)-(2008/11/06(Thu) 13:21:16)
>
> 追加したドロップダウンリスト
> DropDownList m_ddl = new DropDownList();
> に対してIDが割り振られていないだけかもしれません。
>
> なので、追加する前に
> m_ddl.ID = "ddlItem1";
> を追加して現象が改善するかご確認下さい。
>

ご回答ありがとうございます。
追加してみましたが改善はありませんでした。


引用返信 編集キー/
■27459 / inTopicNo.4)  Re[3]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ 純@WAS (23回)-(2008/11/06(Thu) 14:50:42)
改善できずにすいませんでした。

ちょっと、挙動について自分のローカルでテストアプリがあったので、
埋め込んでみたのですが(同様の挙動は実現させていません)…

その作成したドロップダウンリストを配置するコードの前に
以下のコードを埋めて頂いても宜しいでしょうか。

string rowState = GridView1.Rows[e.RowIndex].RowState.ToString();

ここにブレークポイントを置き、実行して、rowStateに何が入るかご確認下さい。

"Normal"の状態の場合、EditItemTemplateではなく、ItemTemplateにドロップダウンリストが追加されている可能性があります。
その為、Editの部分でFindControlをしても見つからないのかもしれません。
EditItemTemplateの場合はrowStateの中に"Alternate,Edit"が入るはずです。

もし、Normalと表示されたら、ドロップダウンリストが追加されたタイミングでEditItemTemplateになっていない可能性もあります。
なので、EditItemTemplateに変換後に実行されるイベントもしくはメソッドの中でドロップダウンリストを追加すればいいはずです。

逆にAlternate,Editの場合は、大変申し訳ないですが、私の知識では及ばない範囲となります。
引用返信 編集キー/
■27460 / inTopicNo.5)  Re[1]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ いしだ (178回)-(2008/11/06(Thu) 15:51:19)
2008/11/06(Thu) 16:05:22 編集(投稿者)

更新ボタンを押した時の処理の流れは、
1.ページインスタンス生成
....
2.Page_Load
....
3.GridView1_RowUpdating

になります。
更新ボタンを押した瞬間にGridView1_RowUpdatingが実行されるわけではありません。
なので、GridView1_RowEditing内で動的にDropDownListを作成している処理は実行
されない事になります。
よって、FindControlしてもnullになります。

TemlateFieldにDropDownListを配置してやってみるわけにはいきませんか?
[参考]
http://jsajax.com/aspGridView/Chapter1/ch1-14.aspx

または、JavaScriptでクッキーに保存しておくとかですかね。
引用返信 編集キー/
■27463 / inTopicNo.6)  Re[2]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ うず (3回)-(2008/11/06(Thu) 17:31:23)
>純@WASさん

再度のお返事ありがとうございました。
検討していただきましてこちらこそ恐縮です。
当方の環境で試してみましたところ、rowStateには"Edit"が代入されました。
これは、VisibleをfalseにしたTextBoxコントロールのことかと思われます。


>いしださん

お返事ありがとうございました。
GridView1_RowUpdatingの前にPage_Loadを挟んでいるのですね。
教えていただきましたやり方で試してみます。(仕様を検討します)
引用返信 編集キー/
■27465 / inTopicNo.7)  Re[3]: 動的に配置したドロップダウンリストから値を取得したい
□投稿者/ うず (4回)-(2008/11/06(Thu) 18:13:53)
いしださんに教えていただいたURLを試してみて、実現することが出来ました。
どうもありがとうございました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -