プロが教えるわが家の防犯対策術!

はじめまして、宜しくお願いします。

ASP.netのC#で開発を行っています。

チェックボックスリストのチェックボックスをチェックした際に、
SelectedIndexChangedイベントが発生しサーバ側で受け取れる
はずだと思っているのですが、全くポストバックされていないようです。

プロパティの「AutoPostBack」はTrueにしています。

ほかに条件はありますでしょうか?
ご存知の方がいらっしゃいましたら、宜しくお願い致します。

A 回答 (4件)

当方のWinXP SP3 + VS2005 SP1 + IIS の環境では


綺麗にポストバックしますよ

データバインディングでCheckBoxの項目を生成するのではなく
Itemsコレクションに追加してテストしております

質問の現象の発生する最小の手順も明記したほうがよいかと思います
開発環境や実行環境の明示もしましょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
そーですか~、ポストバックしするんですね~。

私の環境はVisualStudio2008のC#で、IISは使ってません。
(そもそもIISが何か全くわかっていないのです。すみません勉強します。)

お礼日時:2009/05/21 13:35

もしかして、先ほど、


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; 
  }
}

また、わからなければご連絡ください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
まず、今までやっていたのは方法2の方法でした。
しかし、CheckBoxList1.SelectedIndexChanged += new  EventHandler(CheckBoxList1_SelectedIndexChanged);

の部分はまったく記述していませんでした。
ただチェックボックスリストのコントロールをダブルクリックしてジャンプしたCheckBoxList1_SelectedIndexChangedの中に処理を記述しただけでできると思っていました。

よって方法2を参考に
CheckBoxList1.SelectedIndexChanged += new  EventHandler(CheckBoxList1_SelectedIndexChanged);

を追記してみたところ動作は変わらず。
ブレークポイントを張ってみても通りません。

次に方法1のロジックをHTMLのコードに追記してみました。
が、チェックを付けてもイベントが発生しません。

しかし今度は、「チェックをつけた後に何かほかのボタンを押したら、その時にボタンクリックイベントの直前にSelectedIndexChangedイベントが発生している」模様です。

ひょっとしてこの動作が「SelectedIndexChangedイベントが発生している」状態なんでしょうか?

私はAutoPostBackをTrueにすれば、チェックを入れた瞬間にポストバックが行われると思っていたのですが・・・いかがでしょうか?

長々と書いてしまい申し訳ありません。
宜しくお願い致します。

お礼日時:2009/05/21 13:46

>しかし今度は、「チェックをつけた後に何かほかのボタンを押したら、その時にボタンクリックイベントの直前に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-transitio …

<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にすれば、チェックを入れた瞬間にポストバックが行われると思っていたのですが・・・いかがでしょうか?

その認識で正しいですよ。間違ってないです。

もし、これでも問題解決できなければ、作ったソースコードを見せてください。どうぞ宜しくお願いします。
    • good
    • 0
この回答へのお礼

こんなに丁寧にご回答していただいて、本当に有難うございます!
いただいたソースコードにて正常動作を確認しました。
そして、今まで動かなかった原因が判明しました。

「コントロールのプロパティで"AutoPostBack"をTrueにしているのに、HTMLのコードでみるとTrueになっていない」

という状況でした。
このHTMLに手書きでAutoPostBack=Trueを加えるとうまく行きました。
何故こんなことになったのかは全くわかりませんが・・・??

とりあえずkero-mioさんのソースコードを参考に、デザイナからではなくコードからCheckBoxList1.AutoPostBack = true; とするようにし
正常動作するようになりました!

なんだかデザイナのボタンの名称とHTMLのコード上での名称が
合わないこともあったりしたので、この辺はけっこう怪しむ必要が
ある感じなのでしょうかね?

丁寧にアドバイスありがとうございました!助かりました!

ちなみに、もうひとつ別件で質問があるのですが・・・(調子に乗ってすみませんw kero-mio様が詳しそうなもので。)

Userが金額を入力できるスプレッドがあり、Userが金額を修正した瞬間に合計を集計してスプレッド外のテキストボックスに即座に反映するようにしたいと思っているのですが可能でしょうか?
スプレッドのイベントの取り方などをサイトで調べてもあまり情報が無いようで・・・。
良いURLでもありましたらご教授いただきたいと存じます。

お礼日時:2009/05/21 15:55

>Userが金額を入力できるスプレッドがあり、Userが金額を修正した瞬間に合計を集計してスプレッド外のテキストボックスに即座に反映するようにしたいと思っているのですが可能でしょうか?


スプレッドのイベントの取り方などをサイトで調べてもあまり情報が無いようで・・・。
>良いURLでもありましたらご教授いただきたいと存じます。

この件は、新規質問で別途スレッドをあげて頂けると助かります。
即答できますが、当初の質問に対する問題は解決したので、このスレッドを締め切った後に、上記質問を新規で質問して頂けると有難いです。

わかることであればお答えしますので、宜しくお願いします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/21 17:07

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A