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#になります。
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();
}
}
返答が遅くなり、申し訳ありませんでした。
Dictionary型といったものがあった事すらしなかったのでとても勉強になります。
ただ今回は期日がかなり差し迫っており時間がない為、
質問を投げかけた立場でありながらの勝手となりますが、DataTableと既存コードより見つけた
DropDownList a = ((System.Web.UI.WebControls.DropDownList)this.DropDownList.Rows[i].Cells[no].Controls[0]);
を使用してカスタマイズを進めております。
また、時間的にどうにかなるようであれば、教えていただいたコードを参考にもう一度試してみます。
とても丁寧な対応をありがとうございました。今後の業務に役立てていきます。
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-transitio …
<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>
No.1
- 回答日時:
ご提示されているプログラムは、DropDownListの動的生成と、データバインディングをネイティブに操作しようとする?処理で、今回のご質問の内容とはちょっと違うかなと思います。
GridViewの各行、特定のセルに複数のDropDownListがあり、連携操作したい、ということでしょうか?
イメージとしては、「社員一覧リスト」のようなもので、各社員の行に「都道府県」ドロップダウンと、それに連動した「市町村」ドロップダウンがあるような感じですか?
「都道府県ドロップダウン」を選択すると、配下の「市町村名」を次のドロップダウンに連動表示して、選択入力を可能にする、といったこと?
(外していたらすいません)
要件をもう少し明確にしていただけませんか?
この回答への補足
プログラミングはほぼ初心者の為、説明下手で申し訳ございません。
質問内容としてはご指摘されているとおり、ドロップダウン1に連動してドロップダウン2を選べるといった形式になります。
見た目としては、複数テーブルから抜き出した情報を下記のような
「都道府県」(ドロップダウン)|「市町村名」(ドロップダウン)|「コメント」(テキストボックス)
の3列に並べて表示して、
「都道府県」選択⇒「市町村」表示⇒「市町村名」選択⇒「コメント」表示といった流れで
操作を行いたいと思っております。
検索を掛けて調べても、VBを使用したソースらしきものは見当たるのですが、C#を使用したものが見当たらず躓いていたところです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
決まった拡張子のファイルだけ...
-
C#での関数テーブルの作り方
-
【Java8以降】csvファイルの複...
-
javascript初心者
-
プログラミングの問題です。大...
-
java
-
Visual Basic でのコードをASCI...
-
マージソートについて
-
【struts】 ActionFormで別のAc...
-
スタイルシートが適用されない。
-
C言語でunsigned char配列を連...
-
アルファベットのソート
-
JAVAのDouble型の小数点以下の...
-
ダブルクォーテーションのrepla...
-
hiddenの値が期待した値で取得...
-
Java配列でNullPointerExceptio...
-
JSPでImportエラーになります
-
2つのスクロールバーを連動させ...
-
sin曲線とcos曲線を描くプログ...
-
C言語からJavaに書き換えの質...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
strcmp関数などでの複数の文字...
-
マルチスレッドで同時にFTPアッ...
-
C#での関数テーブルの作り方
-
特定の文字列が一致する行から...
-
string→CStringの型変換について
-
【Java8以降】csvファイルの複...
-
GDI+ DrawString() で指定範囲...
-
C#でIPアドレスの取得について
-
「指定されたキャストは有効で...
-
C# JSONについて
-
C#で型変換
-
Delphiで改行文字の置換がうま...
-
java HashMapで数値データを取...
-
GridViewで複数のDropDownList...
-
strtokでの空文字への置き換え
-
C++のmap
-
決まった拡張子のファイルだけ...
-
PHPのSHA256変換について
-
jap実行時のTomcatのエラーに困...
おすすめ情報