- ベストアンサー
GridViewで複数のDropDownListを連携表示する方法
- ASPの初心者のため、GridViewで複数のDropDownListを連携表示する方法を知りたいです。
- 具体的には、ListAのデータ一覧から、ListBのデータ一覧を表示したいです。
- また、使用している言語はC#です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2の続きです。 サンプル(test2.aspx.cs) using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Repeater_test2 : System.Web.UI.Page { public Dictionary<string, string> employees; public Dictionary<string, string> prefs; public Dictionary<string, Dictionary<string, string>> cities; // 市町村 protected void Page_Load(object sender, EventArgs e) { this.emploee = new List<string> {"あいうえお","かきくけこ"}; this.prefs = new Dictionary<string,string> { {"富山県", "a16"}, {"石川県", "a17"} }; this.cities= new Dictionary<string, Dictionary<string, string>> { {"a16", new Dictionary<string, string>{ {"富山市", "a161"},{"高岡市","a162"},{"射水市","a163"}} }, {"a17", new Dictionary<string, string>{ {"金沢市", "a171"},{"小松市","a172"},{"白山市","a173"}} } }; if (!Page.IsPostBack) { rep_emploee.DataSource = this.emploees; rep_emploee.DataBind(); } } protected void emploee_Databound(object sender, RepeaterItemEventArgs e) { var repitem = e.Item as RepeaterItem; var ddlpref = repitem.FindControl("ddl_pref") as DropDownList; ddlpref.DataSource = this.prefs; ddlpref.DataTextField = "Key"; ddlpref.DataValueField = "Value"; ddlpref.DataBind(); } protected void pref_Changed(object sender, EventArgs e) { var ddl_pref = sender as DropDownList; // (値が変更された)prefドロップダウン var val_pref = ddl_pref.SelectedValue; // その値 var repitem = ddl_pref.Parent as RepeaterItem; // 行アイテム全体 var ddl_city = repitem.FindControl("ddl_city") as DropDownList; // cityドロプダウン var dic_cities = this.cities[val_pref]; // Bindされるべき市町村群 ddl_city.DataSource = dic_cities; ddl_city.DataTextField = "Key"; ddl_city.DataValueField = "Value"; ddl_city.DataBind(); } }
その他の回答 (2)
- aspnet
- ベストアンサー率79% (72/91)
ちょっと時間がとれなくて遅くなりました。 一般的に、繰り返しコントロール内部のテンプレートに入っているコントロールに対し、データバインディングを行うのが普通でしょう。 処理の「キモ」は、コントロールの上位にある「繰り返しコントロール」の行アイテムの把握です。 処理を単純にするため、繰返しコントロールにRepeaterを用い、DropDownListにバインドするデータは、Dictionary型を用いています。また、階層的な扱いとなる「都道府県別市町村」データは、 Dictionary<string, Dictionary<string, string>>のような二重のDictionaryにしています。 実戦では、このあたりはDataTableやObjectDataSourceで扱うことが多いのではないかと思います。 また、GridViewはテンプレートを自由に操れないので、自分はほとんど使用しません。 実戦使用はやはり、「最強の繰返しコントロール」であるListViewでしょう。 サンプル:(test2.aspx) <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test2.aspx.cs" Inherits="Repeater_test2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <table> <colgroup> <col width="300" /> </colgroup> <asp:Repeater ID="rep_emploee" runat="server" OnItemDataBound="emploee_Databound"> <ItemTemplate> <tr> <td> <asp:DropDownList ID="ddl_pref" runat="server" OnSelectedindexchanged="pref_Changed" AutoPostBack="true"></asp:DropDownList> <asp:DropDownList ID="ddl_city" runat="server"></asp:DropDownList> </td> </tr> </ItemTemplate> </asp:Repeater> </table> </div> </form> </body> </html>
- aspnet
- ベストアンサー率79% (72/91)
ご提示されているプログラムは、DropDownListの動的生成と、データバインディングをネイティブに操作しようとする?処理で、今回のご質問の内容とはちょっと違うかなと思います。 GridViewの各行、特定のセルに複数のDropDownListがあり、連携操作したい、ということでしょうか? イメージとしては、「社員一覧リスト」のようなもので、各社員の行に「都道府県」ドロップダウンと、それに連動した「市町村」ドロップダウンがあるような感じですか? 「都道府県ドロップダウン」を選択すると、配下の「市町村名」を次のドロップダウンに連動表示して、選択入力を可能にする、といったこと? (外していたらすいません) 要件をもう少し明確にしていただけませんか?
補足
プログラミングはほぼ初心者の為、説明下手で申し訳ございません。 質問内容としてはご指摘されているとおり、ドロップダウン1に連動してドロップダウン2を選べるといった形式になります。 見た目としては、複数テーブルから抜き出した情報を下記のような 「都道府県」(ドロップダウン)|「市町村名」(ドロップダウン)|「コメント」(テキストボックス) の3列に並べて表示して、 「都道府県」選択⇒「市町村」表示⇒「市町村名」選択⇒「コメント」表示といった流れで 操作を行いたいと思っております。 検索を掛けて調べても、VBを使用したソースらしきものは見当たるのですが、C#を使用したものが見当たらず躓いていたところです。 よろしくお願いします。
お礼
返答が遅くなり、申し訳ありませんでした。 Dictionary型といったものがあった事すらしなかったのでとても勉強になります。 ただ今回は期日がかなり差し迫っており時間がない為、 質問を投げかけた立場でありながらの勝手となりますが、DataTableと既存コードより見つけた DropDownList a = ((System.Web.UI.WebControls.DropDownList)this.DropDownList.Rows[i].Cells[no].Controls[0]); を使用してカスタマイズを進めております。 また、時間的にどうにかなるようであれば、教えていただいたコードを参考にもう一度試してみます。 とても丁寧な対応をありがとうございました。今後の業務に役立てていきます。