web-dev-qa-db-ja.com

ASP.NET CheckBoxは、チェック解除時にCheckedChangedイベントを発生させません。

ASP.NETコンテンツフォームに次のようなCheckBoxがあります。

<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />

私のコードビハインドには、次のメソッドがあります。

protected void chkTest_CheckedChanged(object sender, EventArgs e)
{
}

ブラウザにページをロードしてチェックボックスをクリックすると、チェックボックスがオンになり、ページがポストバックし、chkTest_CheckedChangedが呼び出されているのがわかります。

その後、もう一度CheckBoxをクリックすると、チェックボックスがオフになり、ページがポストバックしますが、chkTest_CheckedChangedは呼び出されません。

このプロセスは繰り返し可能であるため、CheckBoxのチェックを外すと、それをチェックするとイベントが発生します。

Web.ConfigでView Stateを無効にしていますが、View Stateを有効にするとこの問題はなくなります。ビューステートが無効なままで信頼できるイベントを発生させるにはどうすればよいですか?

更新:サーバータグにChecked="true"を設定すると、CheckBoxのチェックを外すときにイベントが発生して状況が逆になりますが、その逆ではありません。

更新2:ページでOnLoadCompleteをオーバーライドし、そこからRequest.Form["__EVENTTARGET"]がCheckBoxのIDに正しく設定されていることを確認できます。

27
Matt

CheckedではなくControlStateViewStateプロパティを格納するカスタムCheckBoxを実装すると、チェックボックスにAutoPostBack=false

ViewStateとは異なり、ControlStateは無効にできず、コントロールの動作に不可欠なデータを保存するために使用できます。

現在、テストするためのビジュアルスタジオ環境はありませんが、次のようになります。

public class MyCheckBox : CheckBox
{
    private bool _checked;

    public override bool Checked { get { return _checked; } set { _checked = value; } }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        //You must tell the page that you use ControlState.
        Page.RegisterRequiresControlState(this);
    }

    protected override object SaveControlState()
    {
        //You save the base's control state, and add your property.
        object obj = base.SaveControlState();

        return new Pair (obj, _checked);
    }

    protected override void LoadControlState(object state)
    {
        if (state != null)
        {
            //Take the property back.
            Pair p = state as Pair;
            if (p != null)
            {
                base.LoadControlState(p.First);
                _checked = (bool)p.Second;
            }
            else
            {
                base.LoadControlState(state);
            }
        }
    }
}

詳細 こちら

19
Johnny5

CheckedChangedイベントを発生させるには、CheckBoxの以下のプロパティを設定します。AutoPostBackプロパティはtrueであり、デフォルト値がfalseまたはtrueになっている必要があります。

AutoPostBack="true" Checked="false"
24
Able Alias

ビューステートが無効な場合、サーバーコードはチェックボックスが以前にチェックされたことを認識しないため、起動しません。したがって、状態が変更されたことを認識しません。 asp.netが知っている限り、ポストバックの前にチェックボックスコントロールのチェックが外されていて、まだチェックされていません。また、Checked="true"を設定するときに表示される逆の動作についても説明します。

8
joshb

古い投稿ですが、この問題を検索した他の人を支援するために、簡単な解決策を共有する必要がありました。

解決策は簡単です:AutoPostBackをオンにします。

        <asp:CheckBox id="checkbox1" runat="server"
                AutoPostBack="True" //<<<<------
                Text="checkbox"
                OnCheckedChanged="knowJobCBOX_CheckedChanged"/>
7
albeck

よくわかりませんが、私のソリューションは.NET Framework 4.0でのみ機能していると思います。

使用する ViewStateMode = "Disabled"は、EnableViewState="false"。これは、ローカルビューステートを保存できることを除いて、同じ動作を警告します。

そのため、チェックボックスで属性ViewStateMode = "Enabled"そして、カスタムチェックボックスを実装せずに問題が解決されます。

6

私は物事を少し整理したかったので、このためのソリューションのテストに少し時間を費やしました。

joshbは、CheckBoxがそのように動作する理由についての彼の説明で正しいです。

昨年どうやってやってきたのかわからないので、もしやったとしても(チェックするために何をしていたのか思い出せません)、簡単な解決策/回避策をまとめました。

public class CheckBox2 : CheckBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        bool isEventTarget = postCollection["__EVENTTARGET"] == UniqueID;
        bool hasChanged = base.LoadPostData(postDataKey, postCollection);
        hasChanged = hasChanged || isEventTarget;
        return hasChanged;
    }
}

ページにCheckBox2を登録し、標準のCheckBoxの代わりに使用すると、ViewStateが無効でAutoPostBackが有効な状態で、期待どおりにCheckedChangedイベントが発生します。

これが機能する方法は、通常のCheckBoxが検証と変更チェックを行うことを許可することですが、追加のチェックを実行して、ポストバックを引き起こしたイベントのターゲットであるかどうかを確認します。ターゲットの場合、trueを返し、フレームワークにCheckedChangedイベントを発生させるように指示します。

編集:これは、CheckBoxのAutoPostBackの問題のみを解決することに注意してください。 PostBackが他のもの(たとえば、ボタン)から呼び出された場合、CheckedChangedイベントは引き続き観察された問題を示します。

1
Matt

さらに:JavaScriptコンソールでエラーを確認してください

Safariでのみ発生したことを除いて、OPで説明されたのとまったく同じ問題を経験しました(checkboxはChromeおよびFirefox)で正常に動作しました。JavaScriptコンソールを調べたところ、不正なjQueryセレクターによってスローされていました。

私の場合、$('a[id*=lbView')がありましたが、終了]。これにより、Safariでエラーが発生しましたが、驚くことに、ChromeやFirefoxでもエラーではありません。

0
Mr.Z

非常に簡単な答えは、その1つのコントロールに対してViewStateをオンに設定することです。

チェックボックスタグのEnableViewState="true"プロパティにAutoPostBack="true"を追加するだけです。

0
Scott Hurst

同じ問題がありました。私はそれに多くの時間を費やし、ついに解決しました。

私の場合、Checkboxはデフォルトで無効になっています。

<asp:CheckBox ID="chkActive" runat="server" Enabled="false"/>

無効または非表示のコントロールに対してViewStateが読み込まれないようにします。したがって、Enabled="false"またはVisible="false"そして、それはexpecetedとして動作します。そしてもちろんViewStateは無効にすべきではありません。

0
algreat