アプリ版:「スタンプのみでお礼する」機能のリリースについて

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#になります。

A 回答 (3件)

ご提示されているプログラムは、DropDownListの動的生成と、データバインディングをネイティブに操作しようとする?処理で、今回のご質問の内容とはちょっと違うかなと思います。



GridViewの各行、特定のセルに複数のDropDownListがあり、連携操作したい、ということでしょうか?
イメージとしては、「社員一覧リスト」のようなもので、各社員の行に「都道府県」ドロップダウンと、それに連動した「市町村」ドロップダウンがあるような感じですか?
「都道府県ドロップダウン」を選択すると、配下の「市町村名」を次のドロップダウンに連動表示して、選択入力を可能にする、といったこと?
(外していたらすいません)

要件をもう少し明確にしていただけませんか?

この回答への補足

プログラミングはほぼ初心者の為、説明下手で申し訳ございません。

質問内容としてはご指摘されているとおり、ドロップダウン1に連動してドロップダウン2を選べるといった形式になります。

見た目としては、複数テーブルから抜き出した情報を下記のような

「都道府県」(ドロップダウン)|「市町村名」(ドロップダウン)|「コメント」(テキストボックス)

の3列に並べて表示して、
「都道府県」選択⇒「市町村」表示⇒「市町村名」選択⇒「コメント」表示といった流れで
操作を行いたいと思っております。

検索を掛けて調べても、VBを使用したソースらしきものは見当たるのですが、C#を使用したものが見当たらず躓いていたところです。

よろしくお願いします。

補足日時:2010/09/08 10:00
    • good
    • 0

ちょっと時間がとれなくて遅くなりました。


一般的に、繰り返しコントロール内部のテンプレートに入っているコントロールに対し、データバインディングを行うのが普通でしょう。
処理の「キモ」は、コントロールの上位にある「繰り返しコントロール」の行アイテムの把握です。

処理を単純にするため、繰返しコントロールに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>
    • good
    • 0

#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();
 }

}
    • good
    • 0
この回答へのお礼

返答が遅くなり、申し訳ありませんでした。

Dictionary型といったものがあった事すらしなかったのでとても勉強になります。


ただ今回は期日がかなり差し迫っており時間がない為、
質問を投げかけた立場でありながらの勝手となりますが、DataTableと既存コードより見つけた

DropDownList a = ((System.Web.UI.WebControls.DropDownList)this.DropDownList.Rows[i].Cells[no].Controls[0]);

を使用してカスタマイズを進めております。


また、時間的にどうにかなるようであれば、教えていただいたコードを参考にもう一度試してみます。

とても丁寧な対応をありがとうございました。今後の業務に役立てていきます。

お礼日時:2010/09/14 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!