C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: 何番目のラジオボタンを選択したのかを取得したい


(過去ログ 43 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■22912 / inTopicNo.1)  何番目のラジオボタンを選択したのかを取得したい
  
□投稿者/ ぽっち (1回)-(2008/08/05(Tue) 17:44:57)

分類:[ASP.NET (C#)] 

2008/08/08(Fri) 14:29:31 編集(投稿者)
2008/08/05(Tue) 17:47:58 編集(投稿者)

こんにちは、いつも拝見させて頂いてます。

現在、開発環境:WindowsXP、VisualStudio2005
使用言語は、C#、ASP.NET

でとあるサイトを開発しております。
そこでラジオボタンを使用しているのですが、何番目のデータをラジオボタンでチェックしているのか
(また、ラジオボタンでチェックしたデータ)を取得したいのですが、取得の仕方が分からずに困っています。

プログラムの動きとしては以下の通りです。

・データバインドで出された「一覧表」の項目の先頭にラジオボタンが付いているページ

↓(1つだけラジオボタンを選んで、確定ボタンを押す)

・確認画面(comfirm.aspx)ページに選択したラジオボタンのデータを表示させる

↓(決定ボタンを押す)

データベースに書き込みされる

という感じの動きをします。


一部分ですがソースとしては、

◆list.aspx内

//ラジオボタンのレジスター
<%@ Register Assembly="ItemRadioButton" Namespace="Controls" TagPrefix="cc2" %>

<cc1:xxxGridView ID="gvGroupList" runat="server" AllowPaging="True" AutoGenerateColumns="False" OnRowEditing="gvGroupList_RowEditing" OnPageIndexChanging="gvGroupList_PageIndexChanging" CssClass="data_grid" OnRowDataBound="gvGroupList_RowDataBound">
<PagerSettings Mode="NextPrevious" NextPageText="次へ" PreviousPageText="前へ" />
<Columns>
<asp:TemplateField HeaderText="選択">
<itemtemplate>
     <center>
<cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" ></cc2:ItemRadioButton>
</center>
   </itemtemplate>
   </asp:TemplateField>
<asp:BoundField DataField="GroupName" HeaderText="グループ名称">
<itemstyle cssclass="group_list_name_column" />
<headerstyle cssclass="group_list_name_column" />
</asp:BoundField>
<asp:BoundField DataField="Explanation" HeaderText="説明">
<itemstyle cssclass="group_list_explanation_column" />
<headerstyle cssclass="group_list_explanation_column" />
</asp:BoundField>
<asp:CommandField ShowCancelButton="False" ShowEditButton="True" >
<headerstyle cssclass="data_grid_edit" />
<itemstyle cssclass="data_grid_edit" />
</asp:CommandField>
</Columns>
<PagerStyle CssClass="pager" />
</cc1:xxxGridView>

◆list.aspx.cs内

/// <summary>
/// グループ一覧を設定します。
/// </summary>
private void setGroupList()
{
SessionData sessiondata = SessionData.GetInstance();

// グループ一覧データを取得する
GroupSetting model = GroupSetting.GetInstance();
DataTable dt = model.GetGroupInfoList();

// グリッドビューの初期設定を行う
this.gvGroupList.PagerSettings.PreviousPageText = global::Resources.CommonStrings.GridViewPreviousPage;
this.gvGroupList.PagerSettings.NextPageText = global::Resources.CommonStrings.GridViewNextPage;
this.gvGroupList.PageSize = int.Parse(ConfigurationManager.AppSettings[AppSettingKey.GridViewPageSize]);
this.gvGroupList.PageIndex = sessiondata.GroupSettingListPageIndex.Value;

//一覧データをバインドする
this.gvGroupList.DataKeyNames = new string[] { "GroupNo" };
this.gvGroupList.DataSource = dt;
this.gvGroupList.DataBind();
}

/// <summary>
/// ページ読み込み時の処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected override void Page_Load(object sender, EventArgs e)
{
base.Page_Load(sender, e);

SessionData sessiondata = SessionData.GetInstance();

if (!this.IsPostBack)
{
// セッションにページインデックスを設定します
if (sessiondata.GroupSettingListPageIndex == null)
{
sessiondata.GroupSettingListPageIndex = STARTPAGE_INDEX;
}

// 画面を構成する要素を設定する
this.SetTitle();
this.setGroupList();
}

}


//確認画面へボタンの押下した時の処理
protected void btnConfirm_Click(object sender, EventArgs e)
{
GroupSetting model = GroupSetting.GetInstance();
this.Response.Redirect(PagePath.GroupConfirm, false);
}

となります。
大変長くなりましたが、お手数ですがご教授ください。


引用返信 編集キー/
■22914 / inTopicNo.2)  Re[1]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ インドリ (9回)-(2008/08/05(Tue) 18:06:12)
No22912 (ぽっち さん) に返信
ラジオボタンのTagプロパティに情報を埋め込んで、それをもとにどれがクリックされたか判断すればいいと思うピヨ。
引用返信 編集キー/
■22917 / inTopicNo.3)  Re[2]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ THREE-ONE (6回)-(2008/08/05(Tue) 18:24:21)
THREE-ONE さんの Web サイト
・RadioButton に CheckedChanged イベントを仕込んで取得する。
・Button が押された時に、GridView.Items をループして FindControl で RadioButton を取得して Checked プロパティを見る。
・ページに HiddenField を置いて、RadioButton に自分がクリックされた時に、その情報を置いた hidden の value に設定するような javascript を出力するように仕込む。
あたりが考えられると思います。

No22914 (インドリ さん) に返信
> ラジオボタンのTagプロパティに情報を埋め込んで、それをもとにどれがクリックされたか判断すればいいと思うピヨ。
Tag プロパティは System.Windows.Forms.RadioButton ですね。
System.Web.UI.WebControls.RadioButto には残念ながらありません。

引用返信 編集キー/
■22922 / inTopicNo.4)  Re[3]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ま (93回)-(2008/08/05(Tue) 20:08:18)
groupName プロパティ設定しているのだから、
普通にどのラジオボタンが選択されたのか取れるんじゃないですか?

document.forms[0].radio1.value が選択されたラジオボタンです。

value には、"1" とか "2" とかラジオボタンの番号とか入れなければならない
とかルールはまったくないので、単純に、そのラジオボタンで選択したときに
必要なデータを "," や "|" を区切り文字としてならべりゃいいです。

又は、
<asp:hidden id="radioItem" value="" />
<cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" 
  onclientclick="return radioChecked(this);"></cc2:ItemRadioButton>
<script>
function radioClicked(o) {
   document.forms[0].<%= radioItem.ClientID %>.value = o.value;
   return false;
}
</script>

というか、サーバーサイドで、request.item("radio1") で取るんでいいんじゃ・・・

引用返信 編集キー/
■22943 / inTopicNo.5)  Re[4]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ THREE-ONE (7回)-(2008/08/06(Wed) 09:57:36)
THREE-ONE さんの Web サイト
THREE-ONEです。

> groupName プロパティ設定しているのだから、
> 普通にどのラジオボタンが選択されたのか取れるんじゃないですか?
>
> document.forms[0].radio1.value が選択されたラジオボタンです。

> というか、サーバーサイドで、request.item("radio1") で取るんでいいんじゃ・・・
使用されているカスタムコントロールの ItemRadioButton の実装によりますね。
普通の RadioButton を使用すると、各行の RadioButton の name には prefix + groupName が設定されて、複数行にわたる同一グループ設定はできません。
また、value は外部から設定することはできません。
それぞれ JavaScript を使うか、http://codezine.jp/a/article/aid/840.aspx のようにカスタムコントロールで対策します。

データソースに主キーがあるなら、<input type="radio" name="radio1" value="<%# 主キー値 %>" />として、まさんのおっしゃるように request["radio1"] がてっとり早いかも。
引用返信 編集キー/
■22949 / inTopicNo.6)  Re[4]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (2回)-(2008/08/06(Wed) 10:55:10)
No22922 (ま さん) に返信

お早い回答有難うございます。

> 又は、
> <asp:hidden id="radioItem" value="" />
> <cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1"
> onclientclick="return radioChecked(this);"></cc2:ItemRadioButton>
> <script>
> function radioClicked(o) {
> document.forms[0].<%= radioItem.ClientID %>.value = o.value;
> return false;
> }
> </script>
>
> というか、サーバーサイドで、request.item("radio1") で取るんでいいんじゃ・・・

なるほど。いろんなサイトを検索かけているとjavascriptを使っているのが見かけたので何となく、こういう風に
作るんだろうか?とは考えていましたが、よく分からず困っていました。

実際今、list.aspx内に対して上記の記述してくださったソースを入れている最中ですが、「属性onclientclickは要素ItemRadioButtonの有効な属性ではありません」といった警告が出ています。一応、無視してデバックしても動いてますが・・・。

後、初心者的な質問で本当に申し訳ないのですが、「・確認画面(comfirm.aspx)ページに選択したラジオボタンのデータを表示させる」という動きをするので、
> <script>
> function radioClicked(o) {
> document.forms[0].<%= radioItem.ClientID %>.value = o.value;
> return false;
> }
> </script>
のソースは、list.aspx内で書いて良いのでしょうか・・・?値、データの受取・表示が分かっていなくて度重なる質問ではありますが、
お願い致します。
引用返信 編集キー/
■22951 / inTopicNo.7)  Re[5]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (3回)-(2008/08/06(Wed) 11:02:39)
No22943 (THREE-ONE さん) に返信

何度もアドバイスを下さって助かります、有難うございます。

> それぞれ JavaScript を使うか、http://codezine.jp/a/article/aid/840.aspx のようにカスタムコントロールで対策します。
>
> データソースに主キーがあるなら、<input type="radio" name="radio1" value="<%# 主キー値 %>" />として、まさんのおっしゃるように request["radio1"] がてっとり早いかも。

http://codezine.jp/a/article/aid/840.aspx サイトのような仕組みです、私が使っているカスタムコントロール内のソースも念のため
記載しておきます。


[DefaultProperty("Checked")]
[ToolboxData("<{0}:ItemRadioButton runat=server></{0}:ItemRadioButton>")]
public class ItemRadioButton : RadioButton
{
protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
bool result = base.LoadPostData(postDataKey, postCollection);
bool newChecked = postCollection[GroupName] == this.UniqueID;
if (this.Checked != newChecked)
{
this.Checked = newChecked;
return true;
}
return result;
}

protected override void Render(HtmlTextWriter writer)
{
base.Render(new WriterWrapper(writer, this));
}
private class WriterWrapper : HtmlTextWriter
{
private ItemRadioButton control;

public WriterWrapper(TextWriter writer, ItemRadioButton control)
: base(writer)
{
this.control = control;
}

public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
switch (key)
{
case HtmlTextWriterAttribute.Name:
base.AddAttribute(key, control.GroupName);
break;
case HtmlTextWriterAttribute.Value:
base.AddAttribute(key, control.UniqueID);
break;
default:
base.AddAttribute(key, value);
break;
}
}
}
}

引用返信 編集キー/
■22982 / inTopicNo.8)  Re[5]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ THREE-ONE (8回)-(2008/08/06(Wed) 16:40:22)
THREE-ONE さんの Web サイト
> 後、初心者的な質問で本当に申し訳ないのですが、「・確認画面(comfirm.aspx)ページに選択したラジオボタンのデータを表示させる」という動きをするので、
>><script>
>>function radioClicked(o) {
>> document.forms[0].<%= radioItem.ClientID %>.value = o.value;
>> return false;
>>}
>></script>
> のソースは、list.aspx内で書いて良いのでしょうか・・・?値、データの受取・表示が分かっていなくて度重なる質問ではありますが、
> お願い致します。
<%= %> を使用しているので、list.aspx 内でないとだめです。
引用返信 編集キー/
■22992 / inTopicNo.9)  Re[6]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (5回)-(2008/08/06(Wed) 17:52:11)
No22982 (THREE-ONE さん) に返信
>>後、初心者的な質問で本当に申し訳ないのですが、「・確認画面(comfirm.aspx)ページに選択したラジオボタンのデータを表示させる」という動きをするので、
> >><script>
> >>function radioClicked(o) {
> >> document.forms[0].<%= radioItem.ClientID %>.value = o.value;
> >> return false;
> >>}
> >></script>
>>のソースは、list.aspx内で書いて良いのでしょうか・・・?値、データの受取・表示が分かっていなくて度重なる質問ではありますが、
>>お願い致します。
> <%= %> を使用しているので、list.aspx 内でないとだめです。


返信、有難うございます。

scriptは、head区間内に
<script type="text/javascript">
function radioClicked(o) {
document.forms[0].<%= radioItem.ClientID %>.value = o.value;
return false;
}
</script>
書いたのですが、エラーが出てしまっています。エラー内容は以下のとおりです。

「名前 'radioItem' は現在のコンテキスト内に存在しません。」

と出ます。

引用返信 編集キー/
■22997 / inTopicNo.10)  Re[7]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ いしだ (162回)-(2008/08/06(Wed) 18:39:23)
> scriptは、head区間内に
bodyタグ内じゃないとダメですね。

引用返信 編集キー/
■23015 / inTopicNo.11)  Re[8]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ま (96回)-(2008/08/07(Thu) 01:48:40)
<itemtemplate>
   <center>
      <cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" ></cc2:ItemRadioButton>
   </center>
</itemtemplate>

これを、

<itemtemplate>
   <center>
      <input type=radio name="radio1" value="<%= ラジオ選択したときの値  %>"/>
   </center>
</itemtemplate>

こうする。

で、
request.item("radio1")
ってやる。
id は自動的に振られないので、name だけ指定する。HTML要素個々のフォームオブジェクトは
無いので、しょうがないから、このラジオボタンだけはローカル変数なりで対処。


前者は
<input type=radio id="RadioB$0" ... name="radio1$0" ...
<input type=radio id="RadioB$1" ... name="radio1$1"
<input type=radio id="RadioB$2" ... name="radio1$2"
<input type=radio id="RadioB$3" ... name="radio1$3"

てな感じになるのかな?
展開されたコード確認してみたらよいですね。
groupname 指定しているのに、グルーピングされないって話でしょう?元々は。

引用返信 編集キー/
■23024 / inTopicNo.12)  Re[9]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (7回)-(2008/08/07(Thu) 14:07:04)
No22997 (いしだ さん) に返信

ご指摘有難うございます。早速修正致しました。

No23015 (ま さん) に返信
> <itemtemplate>
> <center>
> <cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" ></cc2:ItemRadioButton>
> </center>
> </itemtemplate>
>
> これを、
>
> <itemtemplate>
> <center>
> <input type=radio name="radio1" value="<%= ラジオ選択したときの値 %>"/>
> </center>
> </itemtemplate>
>
> こうする。

と言う事は、カスタムラジオボタンを使わないという事ですよね?書き換えてるという解釈であってますでしょうか?

しかしながらこの方法は、仕事の仕様上の問題でラジオボタンは、カスタムラジオボタンを使用することになっています。

> 前者は
> <input type=radio id="RadioB$0" ... name="radio1$0" ...
> <input type=radio id="RadioB$1" ... name="radio1$1"
> <input type=radio id="RadioB$2" ... name="radio1$2"
> <input type=radio id="RadioB$3" ... name="radio1$3"
>
> てな感じになるのかな?
> 展開されたコード確認してみたらよいですね。

コードは確認済みですが、仰る通り上記のようになっております。
念のため、下記にコードも記載します。

<center><input id="List_ctl02_RadioB" type="radio" name="radio1" value="List$ctl02$RadioB" />
</center>

idの「ctl02」部分とValueの「$ctl02$」の数値が項目が増える毎に1加算されて表示されています。


まさんが前回教えてくださった形で実行を押すと、「名前 'radioItem' は現在のコンテキスト内に存在しません。」のエラーで
実行できず、これに関してはいまだに解決できません。


後、これは追記質問になりますが、
1番初めの記事で記載したようにデータベースに登録されたデータ分データバインドで呼び出し、その後ラジオボタンで選択された
データだけを次の画面で表示させる場合は、どうすればよいのでしょうか?

データベースのテーブルは下記の通りです。
■ListTable
Key:ListNum(int)
ListName(varchar)

になります。

とりあえずは、ラジオボタンがどこを選択しているのかを取得できなければ話にならない訳ですが・・・。
引用返信 編集キー/
■23037 / inTopicNo.13)  Re[10]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ THREE-ONE (10回)-(2008/08/07(Thu) 15:56:37)
THREE-ONE さんの Web サイト
 <itemtemplate>
   <center>
      <cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" ></cc2:ItemRadioButton>
   </center>
   <asp:hidden id="hdn" Value="<%# Eval('ListNum') %>" />
</itemtemplate>
のように HiddenField を加えて、カスタムラジオボタンの CheckedChanged イベントを捕まえてください。
sender の Parent.Parent または NamingContainer が GridViewRow ですので、そこから FindControl で HiddenField を取得し、Value プロパティを取得すれば取れると思います。
次の画面へは取得した ListNum の値を Session か、QueryString などで渡して、再度テーブルを検索すればいいでしょう。

引用返信 編集キー/
■23055 / inTopicNo.14)  Re[11]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (8回)-(2008/08/07(Thu) 18:29:59)
No23037 (THREE-ONE さん) に返信
> <itemtemplate>
> <center>
> <cc2:ItemRadioButton id="RadioB" runat="server" groupname="radio1" ></cc2:ItemRadioButton>
> </center>
> <asp:hidden id="hdn" Value="<%# Eval('ListNum') %>" />
> </itemtemplate>
> のように HiddenField を加えて、カスタムラジオボタンの CheckedChanged イベントを捕まえてください。
> sender の Parent.Parent または NamingContainer が GridViewRow ですので、そこから FindControl で HiddenField を取得し、Value プロパティを取得すれば取れると思います。
> 次の画面へは取得した ListNum の値を Session か、QueryString などで渡して、再度テーブルを検索すればいいでしょう。

返信有難うございます。
申し訳ありません。最後の説明

> のように HiddenField を加えて、カスタムラジオボタンの CheckedChanged イベントを捕まえてください。
> sender の Parent.Parent または NamingContainer が GridViewRow ですので、そこから FindControl で HiddenField を取得し、Value プロパティを取得すれば取れると思います。

が意味がよく分かりませんでした。
コードとして書くのは、list.aspx.cs側にまたメソッド追加ということでしょうか???
後、

> 次の画面へは取得した ListNum の値を Session か、QueryString などで渡して、再度テーブルを検索すればいいでしょう。

これに関してですが、list.aspx.cs側に

//確認画面へボタンの押下した時の処理
protected void btnConfirm_Click(object sender, EventArgs e)
{
GroupSettingModel model = GroupSettingModel.GetInstance();
this.Response.Redirect(PagePath.Confirm, false);←これで「確認画面」へリンクします。
}
の処理があるのですが、そこでセッションを持たせる動きを追加させればよいのでしょうか?



初心者な質問で申し訳ありません。



引用返信 編集キー/
■23060 / inTopicNo.15)  Re[12]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ま (97回)-(2008/08/07(Thu) 19:34:46)
>のように HiddenField を加えて、カスタムラジオボタンの CheckedChanged イベントを捕まえてください。
>sender の Parent.Parent または NamingContainer が GridViewRow ですので、そこから FindControl で 
>HiddenField を取得し、Value プロパティを取得すれば取れると思います。
>次の画面へは取得した ListNum の値を Session か、QueryString などで渡して、再度テーブルを検索すれば
>いいでしょう。

これだ。簡単でいい。クライアントのスクリプト触らんでいいし。

>this.Response.Redirect(PagePath.Confirm, false);←これで「確認画面」へリンクします。
これの前でセッションに格納。飛び先の画面でセッションから値を取って加工して
どーたらこーたらするんですね。

class Entity {
   public int col1;
   public int col2;
   public stirng col3;

   private Entity() {}

   public static Entity getInstance(string s) { //s は hidden 要素の value の中身
      string[] arr = s.split("|");
      Entity e = new Entity();
      e.col1 = Integer.parse(arr[0]);
      e.col2 = Integer.parse(arr[1]);
      e.col3 = arr[2];
      return e;
   }
   public overrides string ToString() { //返す値は hidden の value に格納する値
      //区切りの "|" が邪魔なら、適宜 Mime64 なり escape するなりした方がいいのかな。
      //__VIEWSTATE みたいにね。
      return string.format("{0}|{1}|{2}",col1,col2,col3);
   }
}

こーゆー器を用意しておくといいですよ。

引用返信 編集キー/
■23126 / inTopicNo.16)  Re[13]: 何番目のラジオボタンを選択したのかを取得したい
□投稿者/ ぽっち (9回)-(2008/08/08(Fri) 18:10:56)
皆様、大変長くお付き合い頂き誠にありがとうございました。

下記ソースをデータバインドする時に入れることでコンパイル出来ました。
if (e.Row.RowIndex < 0 || e.Row.RowIndex >= this.gvGroupList.DataKeys.Count) return;

DataKey key = this.gvGroupList.DataKeys[e.Row.RowIndex];
int Num = (int)key.Values["GroupNo"];
RadioButton radio = (RadioButton)e.Row.FindControl("RadioB");
radio.Attributes.Add("onClick", "document.form1.SelectedGroupNo.value=" + Num

確認ボタンを押した時の処理には、

String Num = this.SelectedGroupNo.Value;

を追加しました。


本当に皆様ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -