QA@IT

ASP.NETのGridViewのセルに設けたDropDownListの表示・非表示を条件によって切り替えたい

4840 PV

VWD2010で開発しております。
GridViewのある列についてテンプレートの編集を行い、ItemTemplate内でDropDownListを設けました。
リストの表示とレコードとのバインドまではうまくいっています。
レコードの値によって、ある行ではDropDownListを表示し、ある行では数値をテキスト表示するというように、レコードによる条件によってDropDownListの表示・非表示を切り替えたいと思います。
どのようにすればよいかご教示いただきたいです。

【追記】
失礼致しました。
環境は以下の通りです。
OSはWindows8
.NET Framework4
IISは7.0
ブラウザはIE11とGoogleChromeを使っています。

レコードは以下のような構成です。
データ番号 (数値)
データ種別(数値)
表示値(テキスト値)
作業員CD(数値)

このとき、GridView上での列を2列設けて次のようにしたいです。
表示列1【データ番号】
表示列2【表示値 or 作業員】

表示列2において、データ種別=1のときは、[作業員CD]でバインドされた作業員名をDropDownListで表示します。
データ種別=2のときは、[表示値]のほうをDropDownListを用いず、直接テキストで表示します。

このように、GridView上の同じ表示列でも、レコードの異なる列を用い、かつDropDownListの使用・不使用を分けたいです。

回答

データソースコントロールが何だか分かりませんが、普通に SqlDataSource と GridView を組み合わせて使って、Visual Studio でデフォルト設定のままアプリを作っているとすれば、以下の手順でできると思います。

(1)「表示値」を表示する TextBox (Label ?)と「作業員」を表示する DropDownList を、両方とも、「表示列2」の ItemTemplate (EditItemTemplate ?) に配置。

(2) GridView の RowDataBound イベントのハンドラを作る。

(3) GridView の各データ行で、ハンドラの引数 GridViewRowEventArgs オブジェクトから「データ種別」を取得して、その値に応じて TextBox (Label ?) と DropDownList の Visible プロパティを適宜設定する。

以下のような感じです(あくまで感じなので、自分のコードに合わせて修正してください)

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRowView dataRowView = (DataRowView)e.Row.DataItem;
        TextBox tb = (TextBox)e.Row.FindControl("TextBox1");
        DropDownList ddl = (DropDownList)e.Row.FindControl("DropDownList1");

        if (tb != null && ddl != null)
        {
            if ((int)dataRowView["データ種別"] == 2)
            {
                tb.Visible = true;
                ddl.Visible = false;
            }
            else
            {
                tb.Visible = false;
                ddl.Visible = true;
            }
        }
    }
}
  • できました。
    誠にありがとうございました。
    -

ご自分の環境・・・OS, .NET のバージョン、サーバーに何を使っているのか(IIS or IIS Express or ASP.NET 開発サーバー)、使っているブラウザが何かなど・・・は一番最初に書きましょう。Visual Studio のバージョンだけでは情報として不足です。

そして、

レコードの値によって、ある行ではDropDownListを表示し、ある行では数値をテキスト
表示するというように、レコードによる条件によってDropDownListの表示・非表示を切
り替えたいと思います。

というところを、掲示板に書いてあること以外あなたの環境・状況等は何も知りえない回答者や他の閲覧者が分かるように具体的に書いていただけませんか? GridView に表示するということは、その元になる DB などがあるはずですよね。そのあたりから詳しく書いてください。

想像で回答してもらえることを期待しないでください。想像で回答すると、想像が間違っていると混乱を招き、このフォーラムにノイズを増やすばかりですので。

技術的な言葉を使って説明するのが難しければ、ブラウザを使う一般ユーザー目線で Web アプリをどうして欲しいのか書いていただければ、理解しやすいと思います。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。