GridViewで複数のDropDownListを連携表示する方法

このQ&Aのポイント
  • ASPの初心者のため、GridViewで複数のDropDownListを連携表示する方法を知りたいです。
  • 具体的には、ListAのデータ一覧から、ListBのデータ一覧を表示したいです。
  • また、使用している言語はC#です。
回答を見る
  • ベストアンサー

GridViewで複数のDropDownListを連携表示しようとして

GridViewで複数のDropDownListを連携表示しようとしています。 操作全般はソースコード(*.aspx.cs)から行い、動的な処理を行えるようにしたいのですが、 DropDownList同士のバインドのやり方が分からなくて、困っています。 具体的には、ListAのデータ一覧から、ListBのデータ一覧を表示するといった処理になります。 また、GridView上でのDropDownListの描画は、ライブラリにメソッドを組み込み、そこから呼び出しています。 ライブラリの宣言文は以下の通りです。 /// <summary> /// 子コントロールとテンプレートが属する Control オブジェクトを定義します。 /// </summary> /// <param name="container"></param> public void InstantiateIn(System.Web.UI.Control container) { System.Web.UI.WebControls.DropDownList wddlFrame = new System.Web.UI.WebControls.DropDownList(); wddlFrame.AutoPostBack = false; wddlFrame.CausesValidation = false; wddlFrame.ID = _IDname; wddlFrame.EnableViewState = true; wddlFrame.DataBinding += new EventHandler(wddlFrame_DataBinding); wddlFrame.Style.Add("width", this._listWidth.ToString() + "px"); container.Controls.Add(wddlFrame); } /// <summary> /// コントロールがデータソースに連結すると発生します。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void wddlFrame_DataBinding(object sender, EventArgs e) { System.Web.UI.WebControls.DropDownList wddlFrame = (System.Web.UI.WebControls.DropDownList)sender; GridViewRow container = (GridViewRow)wddlFrame.NamingContainer; if (this._listItems != null) { wddlFrame.Items.AddRange(this._listItems); } } ASPを弄るのは初めてで、また既存のデータをカスタマイズしているだけの為、 知らずに使っている部分も多くあり、完全に手詰まり状態となっています。 分かる方がおられましたらご教授お願いします。 上記ソースから察せられるかと思いますが、使用している言語はC#になります。

質問者が選んだベストアンサー

  • ベストアンサー
  • aspnet
  • ベストアンサー率79% (72/91)
回答No.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();  } }

garnet20
質問者

お礼

返答が遅くなり、申し訳ありませんでした。 Dictionary型といったものがあった事すらしなかったのでとても勉強になります。 ただ今回は期日がかなり差し迫っており時間がない為、 質問を投げかけた立場でありながらの勝手となりますが、DataTableと既存コードより見つけた DropDownList a = ((System.Web.UI.WebControls.DropDownList)this.DropDownList.Rows[i].Cells[no].Controls[0]); を使用してカスタマイズを進めております。 また、時間的にどうにかなるようであれば、教えていただいたコードを参考にもう一度試してみます。 とても丁寧な対応をありがとうございました。今後の業務に役立てていきます。

その他の回答 (2)

  • aspnet
  • ベストアンサー率79% (72/91)
回答No.2

ちょっと時間がとれなくて遅くなりました。 一般的に、繰り返しコントロール内部のテンプレートに入っているコントロールに対し、データバインディングを行うのが普通でしょう。 処理の「キモ」は、コントロールの上位にある「繰り返しコントロール」の行アイテムの把握です。 処理を単純にするため、繰返しコントロールに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>        &nbsp;        <asp:DropDownList ID="ddl_city" runat="server"></asp:DropDownList>       </td>      </tr>      </ItemTemplate>     </asp:Repeater>    </table>   </div>  </form> </body> </html>

  • aspnet
  • ベストアンサー率79% (72/91)
回答No.1

ご提示されているプログラムは、DropDownListの動的生成と、データバインディングをネイティブに操作しようとする?処理で、今回のご質問の内容とはちょっと違うかなと思います。 GridViewの各行、特定のセルに複数のDropDownListがあり、連携操作したい、ということでしょうか? イメージとしては、「社員一覧リスト」のようなもので、各社員の行に「都道府県」ドロップダウンと、それに連動した「市町村」ドロップダウンがあるような感じですか? 「都道府県ドロップダウン」を選択すると、配下の「市町村名」を次のドロップダウンに連動表示して、選択入力を可能にする、といったこと? (外していたらすいません) 要件をもう少し明確にしていただけませんか?

garnet20
質問者

補足

プログラミングはほぼ初心者の為、説明下手で申し訳ございません。 質問内容としてはご指摘されているとおり、ドロップダウン1に連動してドロップダウン2を選べるといった形式になります。 見た目としては、複数テーブルから抜き出した情報を下記のような 「都道府県」(ドロップダウン)|「市町村名」(ドロップダウン)|「コメント」(テキストボックス) の3列に並べて表示して、 「都道府県」選択⇒「市町村」表示⇒「市町村名」選択⇒「コメント」表示といった流れで 操作を行いたいと思っております。 検索を掛けて調べても、VBを使用したソースらしきものは見当たるのですが、C#を使用したものが見当たらず躓いていたところです。 よろしくお願いします。

関連するQ&A

  • GridViewのEditTemplate

    すみません。改めて質問させていただきます。 GridViewのEditTemplateにDropDownListが配置されています。 更新したときに、そのDropDownListの値を取得する方法をご教授頂きたいです。 言語はVBです。以下のコードを書きましたが取得できません(Updatingイベントのとき)↓ Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating MsgBox(GridView1.Rows(e.RowIndex).ToString) End Sub とりあえずメッセージボックスにドロップダウンリストの値を表示したいです。

  • ASP.NET2.0 GridViewコントロール

    お世話になります。 Vs2005のASP.NETを学習しております。 現在グリッドビューコントロールに、SQLデータソースコントロールを関連付けて、Oracleデータベースよりテーブルの項目を取得しました。 グリッドビューコントロールはコントロール機能として、更新・削除・追加もコードレスで行えるような仕組みになっているのですが、 更新を行い実行したら、下記のエラーが表示されてしまいました。 '/WebSite4' アプリケーションでサーバー エラーが発生しました。 -------------------------------------------------------------------------------- ORA-12704: キャラクタ・セットが一致しません。 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.Data.OracleClient.OracleException: ORA-12704: キャラクタ・セットが一致しません。 ソース エラー: 現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。 スタック トレース: [OracleException (0x80131938): ORA-12704: キャラクタ・セットが一致しません。 ] System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) +166 System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) +1719 System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) +503 System.Data.OracleClient.OracleCommand.ExecuteNonQuery() +125 System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation) +493 System.Web.UI.WebControls.SqlDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +915 System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +179 System.Web.UI.WebControls.DetailsView.HandleUpdate(String commandArg, Boolean causesValidation) +1197 System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +545 System.Web.UI.WebControls.DetailsView.OnBubbleEvent(Object source, EventArgs e) +162 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +56 System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(Object source, EventArgs e) +117 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +56 System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +107 System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +175 System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +31 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +32 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +244 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3840 -------------------------------------------------------------------------------- バージョン情報: Microsoft .NET Framework バージョン:2.0.50727.832; ASP.NET バージョン:2.0.50727.832 もしかしたら当たり前のことなのかもしれませんが、私には原因が掴めず困ってしまいました。 何かしらのヒントを教えて頂けたら幸いです。 どうか宜しくお願い致します。

  • GridViewコントロールで列を固定するには?

    DataGridViewの場合、以下のサイトに説明があったのですが、 http://www.atmarkit.co.jp/fdotnet/dotnettips/509dgvfrozen/dgvfrozen.html GridViewを使用している場合、 grdList.Columns(2).Frozen = True と記述すると、エラーとなります。 「'Frozen' は 'System.Web.UI.WebControls.DataControlField' のメンバではありません。」 GridViewではどのように記述するのでしょうか?

  • GridView でコンボボックスの設定

    再質問をさせていただきます。 gridviewを作成しました。 -------------------------------------------------------------------------------- <asp:GridView ID="grdList" runat="server" DataSourceID="sqldsList"> <Columns> <asp:BoundField DataField="ITEMNO" HeaderText="ITEMNO"></asp:BoundField> <asp:TextBox ID="txtNAME" runat="server" Text='<%# Bind("ITEM_NAME") %>'></asp:TextBox> <ItemTemplate>   <asp:DropDownList CssClass="cnbstr" ID="cnb_KBN" runat="server"     DataSourceID="sqldscnb1" DataTextField="NAME" DataValueField="NO" AutoPostBack="True"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> -------------------------------------------------------------------------------- このコンボボックスに値を設定させたいのですが、ITEMNO="01"の時だけ、txtNAMEの値を初期表示したいと思っています。 RowDataBound、RowCreatedで可能かと思ったのですができずに困っています。 どなたかご教授お願いします。 Protected Sub grdList_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdList.RowDataBound   If e.Row.RowType = DataControlRowType.DataRow Then     IF DataBinder.Eval(e.Row.DataItem, "ITEMNO").ToString() = "01" THEN       Dim dlist As DropDownList = DirectCast(e.Row.FindControl("cnb_KBN"), DropDownList)       dlist.SelectedValue = "ITEM_NAME" ←こんな感じのことをしたい     ELSE       設定しない     END IF   End If End Sub

  • GridViewのイベントの関連づけ

    GridViewのイベントを作成したいのですが、 >Protected Sub grdList_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdList.RowCreated と指定すると、 >「HANDLES 句には、それを含む型または基本型の 1 つで定義された WithEvents 変数が必要です。」 とHandles grdList.RowCreatedのgrdListの下に青い波線が引かれエラーになります。 解決策をどなたかお願いします。

  • UpdatePanel と GridViewについて教えてください

    現在、ASP.NET(VB)にて開発を行っています。今悩んでいる事は GridView内でUpdatePanelを使用した際にエラーが表示されます。 エラー内容は下記の通りです。 InvalidCastException はユーザーコードによってハンドルされませんでした。 ______________________________________________________________________ 型 'System.Web.UI.UpdatePanel' のオブジェクト型 'System.Web.UI.WebControl.GridViewRow' にキャストできません。 どなたか、エラーの対処方をご存知の方がいらっしゃいましたらご指導宜しくお願いします。なお、ソースは下記の様に記述してみました。 <%@ Page Language="VB" %> <%@ Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Dim txt As TextBox = DirectCast(sender, TextBox) Dim row As GridViewRow = DirectCast(txt.Parent.Parent, GridViewRow) CD.Text = txt.Text End Sub </script> <html> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="SM" runat="server"> </asp:ScriptManager> <asp:TextBox ID="CD" runat="server" Width="50px"></asp:TextBox> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="CD" DataSourceID="Source" ShowFooter="True"> <Columns> <asp:TemplateField HeaderText="CD"> <ItemTemplate> <asp:Label ID="lbl" runat="server" Text='<%# Bind("CD") %>'></asp:Label> </ItemTemplate> <FooterTemplate> <asp:UpdatePanel ID="UP" runat="server"> <ContentTemplate> <asp:TextBox ID="NewCD" runat="server" AutoPostBack="True" OnTextChanged="TextChanged" Width="50px"></asp:TextBox> </ContentTemplate> </asp:UpdatePanel> </FooterTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:SqlDataSource ID="Source" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionStrings %>" SelectCommand="SELECT * FROM [TABLE]" ProviderName="System.Data.SqlClient"> </asp:SqlDataSource> </form> </body> </html>

  • RegisterClientScriptBlockの使い方について

    皆さんこんばんは、宜しくお願い致します。 現在ASP.NETでWebアプリを開発しておりますが、自作共通クラスを使用 したRegisterClientScriptBlockがうまく動作しません。ご存知の方が いらっしゃいましたら、ご教示をお願い致します。 プラットフォーム:ASP.NET2.0 開発環境:Visual studio 2005 Pro 開発言語:C# 使用OS:WindowsXP Pro ブラウザ:IE7 ▽ Default.aspx.cs ▽ using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnRef_Click(object sender, EventArgs e) { // Commonクラスのインスタンス作成 Common objCm = new Common(); objCm.mAlertTest(); } } ▽ App_Code/Common.cs ▽ using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public class Common : System.Web.UI.Page { public void mAlertTest() { // ClientScriptManagerクラスのインスタンス作成 ClientScriptManager objCsm = ClientScript; // アラート表示 objCsm.RegisterClientScriptBlock( this.GetType(), "alert", "<script language=JavaScript>alert('test');</script>" ); } } 症状としましては、ビルド時にエラーは発生しませんが、btnRef_Click メソッドを実行してもポストバックされるだけでアラートが表示 されません。mAlertTestメソッドの内容をbtnRef_Click内に記述すると 正常にアラートが表示されます。 Default.aspx内にスクリプトが登録されていない、という事でしょうか? ご回答をお待ちしております。宜しくお願い致します。

  • ASP.Net SetEditRowの反対メソッド

    大変お世話になっております。 日夜、ASP.NETを勉強しておりますが、まだまだ初心者の域を脱しできない感じでございます。 GridView で 編集モードにするのに GridView.SetEditRow(インデックス) で出来ることは知っているのですが、これを通常のモード(ItemTemplate) に戻すメソッドはないのでしょうか? http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.seteditrow.aspx こちらの左側に表示してあるメソッドを見てみたのですが、どれがそれにあたるのか、まったくわかりません。 GridView.DataBind を実行しても元に戻りませんし・・・ もしかしたら、すごく簡単な事かもしれませんが、何卒ご教授いただければと存じます。 よろしくお願い申し上げます。

  • listの格納されている値をGridViewに追加

    下記のようなロジックを動かそうとしていますが、うまくいきません。 「データベースからinteger型の値を取得して、それをreadメソッドでlistに一旦格納し、For Eachで1つずつGridviewに追加していく。」 エラー内容でググっても良くわからなかったので、解決策がわかる方がいましたらご助言お願い致します。。 *DBから値を取得し、listに格納するところは問題なく動いていますが、Gridviewに追加するところでこけます。 エラー箇所:GridView1.Columns.Add(item) エラー内容:「型 'Integer' の値をを 'System.Web.UI.WebControls.DataControlField' に変換できません。」 Dim list As List(Of Integer) = New List(Of Integer) Dim result As Integer = Byte.MinValue Do While testReader.Read() result = Convert.ToInt32(testReader("price")) list.Add(result) Loop For Each item In list GridView1.Columns.Add(item) Next

  • GridViewからテンプレートフィールドのEvalにおける、値の取得

    現在VisualStudio2005 ASP.NET VBで作成しております。 現在、GridViewを使用しておりまして、バウンドフィールド、ハイパーリンクフィールド、テンプレートフィールド、 をそれぞれ、配置しております。 <asp:ButtonField DataTextField="expression_no" HeaderText="No" SortExpression="expression_no" Text="ボタン" CommandName="Details" > <ItemStyle CssClass="GridBorder" /> </asp:ButtonField> <asp:BoundField DataField="item_name" HeaderText="商品名" SortExpression="item_name" > <ItemStyle CssClass="GridBorder" /> </asp:BoundField> <asp:TemplateField HeaderText="年額" SortExpression="moneyPerYear"> <ItemStyle HorizontalAlign="Right" CssClass="GridBorder" /> <ItemTemplate> <asp:Label ID="moneyPerYearGrid" runat="server" Text='<%# Eval("moneyPerYear", "{0:c0}") %>'></asp:Label> </ItemTemplate> <FooterTemplate> <asp:Label ID="lblSummary1" runat="server" ForeColor="Red"></asp:Label> </FooterTemplate> <FooterStyle HorizontalAlign="Right" /> </asp:TemplateField> ハイパーリンクフィールドがクリックされたタイミングで、そのクリックされた行の、データを取得したいと考えております。 Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) ' コマンド名が“Details”の場合にのみ処理 If e.CommandName = "Details" Then ' 主キー(isbn列)の値を取得 Dim isbn As String = GridView1.DataKeys(e.CommandArgument).Value.ToString Session("Gridrow") = GridView1.Rows(e.CommandArgument) Dim datarow As TableRow = Session("GridRow") Labaffiliation_name.Text = datarow.Cells(0).Text '証明No Labinsurance_item_name.Text = datarow.Cells(1).Text '商品名 LabPerYearContract.Text = datarow.Cells(2).Text '年金額 End If End Sub 下記のプログラムを実行すると、データが取得できるのはバウンドフィールドでGridViewにデータバインドしている Labinsurance_item_name.Text = datarow.Cells(1).Text '商品名 のみで、他のフィールドのデータが取得できません。 どなたかご教授いただけますと幸いです。

専門家に質問してみよう