DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridの動的コントロール作成について

環境/言語:[WindowsXP、VB.NET、Framework1.1]
分類:[ASP.NET]

DataGridを利用したプログラムを作成しています。

DataGrid内へ動的にRadioButtonListを作成したい場合
どのように記述すればよろしいでしょうか?

処理としましては…、

@ RadioButtonListに表示する選択項目は、
  全てデータベースにて保持しているため
  行によって選択項目が違うことがあります。

A ボタンをクリックした時に
  RadioButtonListで選択された値を登録する必要があります。


以上です。よろしくお願いします。
> @ RadioButtonListに表示する選択項目は、
>   全てデータベースにて保持しているため
>   行によって選択項目が違うことがあります。
>
> A ボタンをクリックした時に
>   RadioButtonListで選択された値を登録する必要があります。
これ私も最初悩みました。RadioButtonListにSelectedValueみたいなのが
あれば楽なんですよね(>-<;;)

方法としては、
@DataGridへバインドしたタイミングでコードでどの値が選択させているかを調べて設定
AあらかじめDBからデータを取得してくるときに、RadioButtonListのそれぞれの値に対応した列を用意しておく。
例:DB上のSelectedRadio列の値が1の場合:RadioButton_1を選択
  DB上のSelectedRadio列の値が2の場合:RadioButton_2を選択
  DB上のSelectedRadio列の値が3の場合:RadioButton_3を選択
のような場合、あらかじめ次のようなSQLを使って、
 CASE SelectedRaido WHEN 1 THEN 1 ELSE 0 END AS RadioButton_1Value,
CASE SelectedRaido WHEN 2 THEN 1 ELSE 0 END AS RadioButton_2Value,
CASE SelectedRaido WHEN 3 THEN 1 ELSE 0 END AS RadioButton_3Value
疑似列を用意して、それぞれのRadioButtonのCheckedにバインドする。
(これだったらRadioButtonListじゃないほうがやりやすいですね、、)
この場合、更新処理が若干面倒という問題もあります。

ぱっと思いつくのはこれくらいでしょうか。
追記です。

DataGridのデータソースにDataViewを利用するとか
諦めてDropDownListにしてしまうって手もありますね。

これらの方法は、RadioButtonの値が固定であるという思い込みで
書き込んでしまったのですが、
RadioButtonの値自体も動的に変化したりするんですかね?
例:1行目のRadioButton → 1、2、3、、、、
  2行目のRadioButton → 5、6、7、、、、
返信が遅くなりまして申し訳ありません。


> DataGridのデータソースにDataViewを利用するとか
私が詳しく記述していなかったのが悪かったのですが、
vs2003で作成しているため、残念ながらDataViewコントロールがありません。

> 諦めてDropDownListにしてしまうって手もありますね。
クライアントの立場から考えると、Gridの行数が多いので
ちょっと操作面で面倒かもしれません。(2回のクリックが発生するため)

> RadioButtonの値自体も動的に変化したりするんですかね?
> 例:1行目のRadioButton → 1、2、3、、、、
>   2行目のRadioButton → 5、6、7、、、、
はい、実は動的に変化します。
値も違えば、選択する項目の数も違う可能性があります。
それらの情報は、クライアントが自由にメンテナンスできるため
予測することは不可能です。


上手く説明できずにすみませんが、
よろしくお願いします。
>>DataGridのデータソースにDataViewを利用するとか
> 私が詳しく記述していなかったのが悪かったのですが、
> vs2003で作成しているため、残念ながらDataViewコントロールがありません。
↑はGridViewコントロールのことですかね?
私の書いたやつはクラスのDataViewです。
http://msdn.microsoft.com/ja-jp/library/system.data.dataview(VS.80).aspx
今回の要件には使いづらそうですね、、、

>>諦めてDropDownListにしてしまうって手もありますね。
> クライアントの立場から考えると、Gridの行数が多いので
> ちょっと操作面で面倒かもしれません。(2回のクリックが発生するため)
んん?2回クリック?RadioButtonでもクリックは発生しますよね?
(もちろんどちらもキーボードから選択でもOKでしょうが、、)

>>RadioButtonの値自体も動的に変化したりするんですかね?
>>例:1行目のRadioButton → 1、2、3、、、、
>>  2行目のRadioButton → 5、6、7、、、、
> はい、実は動的に変化します。
> 値も違えば、選択する項目の数も違う可能性があります。
> それらの情報は、クライアントが自由にメンテナンスできるため
> 予測することは不可能です。

では選択された値を手動で調べるほうが楽かも知れないですね、、
C#ですが、こんな感じでしょうか?

//保存をDataGridのSelectedIndexChangedイベントで行う場合
//DataGridコントロールのid = dataGrid
//RadioButtonListコントロールのid = radioButtonList
protected void dataGrid_SelectedIndexChanged(object sender, EventArgs e){
  DataGridItem item = dataGrid.SelectedItem;
  RadioButtonList list = item.FindControls("radioButtonList") as RadioButtonList;
  foreach (ListItem radio in list.Items)
  {
    if (radio.Selected)
    {
      //選択した値はradio.Valueで取得できる;
    }
  }

}
ごめんなさい。
まずバインドするときが抜けてましたね、、、
表示する行数にもよりますが、手動でバインドかなぁ、、

ひとまずDataGridにはバインドしないRadioButtonListを用意しといて、
あとでループで設定してくイメージですかね。

またまたC#ですが、、

//データ取得時
DataTable dt = //データ一括取得;
Session["任意の文字列"] = dt; //セッションへ格納(データサイズに注意!)

//データバインド時
DataTable dt = Session["任意の文字列"] as DataTable;
for(int i = 0;i < dataGrid.Items.Count;i++){
  RadioButtonList radioButtonList = dataGrid.Items[i].FindControl("radioButtonList") as RadioButtonList;
  DataView view = new DataView();
  view.Table = dt;
  view.RowFilter = //それぞれの行ごとにフィルタ処理;
  radioButtonList.DataTextField = //表示列名;
  radioButtonList.DataValueField = //選択時の値の列名;
  radioButtonList.DataSource = view;
  radioButtonList.DataBind();
}

こんな感じでしょうか?
(手書きですので変なとこがあるかも、、、)

なんかダサい方法ですよね、、、、

DOBON.NET | プログラミング道 | プログラミング掲示板