• ベストアンサー

ASP.netで、CheckBoxListのSelectedIndexChangedが発生しません!

はじめまして、宜しくお願いします。 ASP.netのC#で開発を行っています。 チェックボックスリストのチェックボックスをチェックした際に、 SelectedIndexChangedイベントが発生しサーバ側で受け取れる はずだと思っているのですが、全くポストバックされていないようです。 プロパティの「AutoPostBack」はTrueにしています。 ほかに条件はありますでしょうか? ご存知の方がいらっしゃいましたら、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#158371
noname#158371
回答No.2

もしかして、先ほど、 http://okwave.jp/qa4974802.html で質問したやり方で、動的に選択項目を生成しているからイベントが発生しないとか?いや、それはないかなぁ。AutoPostBackもTrueみたいですし。 一応、イベント設定方法のやり方は2種類あるのでどちらかお好きな方でおためしください。 方法1: CheckBoxList を定義している個所に 「OnSelectedIndexChanged="イベント処理用メソッド名"」 を記述する 例: <asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged"> </asp:CheckBoxList> 方法2: Page_Init や Page_Load などのイベントで、 CheckBoxList1.SelectedIndexChanged += new EventHandler(イベント処理用メソッド名); を記述する 例: protected void Page_Init(object sender, EventArgs e) {   CheckBoxList1.SelectedIndexChanged += new  EventHandler(CheckBoxList1_SelectedIndexChanged); } protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e) {   // 選択された時の処理を書く   if (CheckBoxList1.SelectedIndex > -1)   {     Label1.Text = CheckBoxList1.SelectedValue;   }   else   {     Label1.Text = string.Empty;    } } また、わからなければご連絡ください。

gawein193
質問者

お礼

ご回答ありがとうございます! まず、今までやっていたのは方法2の方法でした。 しかし、CheckBoxList1.SelectedIndexChanged += new  EventHandler(CheckBoxList1_SelectedIndexChanged); の部分はまったく記述していませんでした。 ただチェックボックスリストのコントロールをダブルクリックしてジャンプしたCheckBoxList1_SelectedIndexChangedの中に処理を記述しただけでできると思っていました。 よって方法2を参考に CheckBoxList1.SelectedIndexChanged += new  EventHandler(CheckBoxList1_SelectedIndexChanged); を追記してみたところ動作は変わらず。 ブレークポイントを張ってみても通りません。 次に方法1のロジックをHTMLのコードに追記してみました。 が、チェックを付けてもイベントが発生しません。 しかし今度は、「チェックをつけた後に何かほかのボタンを押したら、その時にボタンクリックイベントの直前にSelectedIndexChangedイベントが発生している」模様です。 ひょっとしてこの動作が「SelectedIndexChangedイベントが発生している」状態なんでしょうか? 私はAutoPostBackをTrueにすれば、チェックを入れた瞬間にポストバックが行われると思っていたのですが・・・いかがでしょうか? 長々と書いてしまい申し訳ありません。 宜しくお願い致します。

その他の回答 (3)

noname#158371
noname#158371
回答No.4

>Userが金額を入力できるスプレッドがあり、Userが金額を修正した瞬間に合計を集計してスプレッド外のテキストボックスに即座に反映するようにしたいと思っているのですが可能でしょうか? スプレッドのイベントの取り方などをサイトで調べてもあまり情報が無いようで・・・。 >良いURLでもありましたらご教授いただきたいと存じます。 この件は、新規質問で別途スレッドをあげて頂けると助かります。 即答できますが、当初の質問に対する問題は解決したので、このスレッドを締め切った後に、上記質問を新規で質問して頂けると有難いです。 わかることであればお答えしますので、宜しくお願いします。

gawein193
質問者

お礼

了解致しました。 何度も丁寧に有難うございます!

noname#158371
noname#158371
回答No.3

>しかし今度は、「チェックをつけた後に何かほかのボタンを押したら、その時にボタンクリックイベントの直前にSelectedIndexChangedイベントが発生している」模様です。 もしかして、IsPostBack で条件判定している中に SelectedIndexChangedイベントを設定したり、AutoPostBackを Trueにさせるようなことしてませんか? ひとまず下記のようなコードに書きなおしてみてください。 -------------------------------------------------------------- *.aspx ファイル -------------------------------------------------------------- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:CheckBoxList ID="CheckBoxList1" runat="server" /> <asp:Label ID="Label1" runat="server"> </asp:Label> </form> </body> </html> -------------------------------------------------------------- *.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 Default : System.Web.UI.Page {   protected void Page_Init(object sender, EventArgs e)   {     // CheckBoxList1のイベントを追加する     CheckBoxList1.AutoPostBack = true;     // ポストバックを有効     CheckBoxList1.EnableViewState = true;   // ViewStateを有効     CheckBoxList1.SelectedIndexChanged += new EventHandler(CheckBoxList1_SelectedIndexChanged);   }   protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)   {     // 選択された時の処理を書く     if (CheckBoxList1.SelectedIndex > -1)     {       string value = string.Empty;       foreach (ListItem item in CheckBoxList1.Items)       {         if (!item.Selected)         {           continue;         }         if (!string.IsNullOrEmpty(value))         {           value += ",";         }         value += item.Value;       }       Label1.Text = value;     }     else     {       Label1.Text = string.Empty;     }   }   protected void Page_Load(object sender, EventArgs e)   {     // PostBackではなく初期ロードの時     if (!IsPostBack)     {       // チェックボックスリストの項目を表示する       List<ListItem> items = new List<ListItem>();       items.Add(new ListItem("項目1", "1"));       items.Add(new ListItem("項目2", "2"));       items.Add(new ListItem("項目3", "3"));       CheckBoxList1.Items.AddRange(items.ToArray());     }   } } もし、上記でも動かなければ、一度、リビルドしてみてください。 イベント設定したのに、イベントが動かないというのは、 イベントを設定したロジックを通っていない以外にはありえませんので よく、ソースコードをご確認ください。 >私はAutoPostBackをTrueにすれば、チェックを入れた瞬間にポストバックが行われると思っていたのですが・・・いかがでしょうか? その認識で正しいですよ。間違ってないです。 もし、これでも問題解決できなければ、作ったソースコードを見せてください。どうぞ宜しくお願いします。

gawein193
質問者

お礼

こんなに丁寧にご回答していただいて、本当に有難うございます! いただいたソースコードにて正常動作を確認しました。 そして、今まで動かなかった原因が判明しました。 「コントロールのプロパティで"AutoPostBack"をTrueにしているのに、HTMLのコードでみるとTrueになっていない」 という状況でした。 このHTMLに手書きでAutoPostBack=Trueを加えるとうまく行きました。 何故こんなことになったのかは全くわかりませんが・・・?? とりあえずkero-mioさんのソースコードを参考に、デザイナからではなくコードからCheckBoxList1.AutoPostBack = true; とするようにし 正常動作するようになりました! なんだかデザイナのボタンの名称とHTMLのコード上での名称が 合わないこともあったりしたので、この辺はけっこう怪しむ必要が ある感じなのでしょうかね? 丁寧にアドバイスありがとうございました!助かりました! ちなみに、もうひとつ別件で質問があるのですが・・・(調子に乗ってすみませんw kero-mio様が詳しそうなもので。) Userが金額を入力できるスプレッドがあり、Userが金額を修正した瞬間に合計を集計してスプレッド外のテキストボックスに即座に反映するようにしたいと思っているのですが可能でしょうか? スプレッドのイベントの取り方などをサイトで調べてもあまり情報が無いようで・・・。 良いURLでもありましたらご教授いただきたいと存じます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

当方のWinXP SP3 + VS2005 SP1 + IIS の環境では 綺麗にポストバックしますよ データバインディングでCheckBoxの項目を生成するのではなく Itemsコレクションに追加してテストしております 質問の現象の発生する最小の手順も明記したほうがよいかと思います 開発環境や実行環境の明示もしましょう

gawein193
質問者

お礼

ご回答ありがとうございます。 そーですか~、ポストバックしするんですね~。 私の環境はVisualStudio2008のC#で、IISは使ってません。 (そもそもIISが何か全くわかっていないのです。すみません勉強します。)

関連するQ&A