2

ページのライフサイクルのさまざまな段階で、チェックボックスの表示をチェック状態に設定することの影響を理解するのに問題があります。

以下に、動的に作成されたチェックボックスのサンプルコードを示します。

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        check = new CheckBox();
        check.AutoPostBack = true;
        check.Text = "checkbox1";
        check.ToolTip = "tooltip for checkbox1";
        check.CheckedChanged += new EventHandler(check_CheckedChanged);  

        this.Form.Controls.Add(check);
        Button btn = new Button();
        btn.Text = "click me";
        btn.Click += new EventHandler(btn_Click);
        this.Form.Controls.Add(btn);

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            check.Checked = true;
            check.Text = "text reassigned.";
            check.ToolTip = "tooltip reassigned";
        }

    }

    protected override void OnPreRenderComplete(EventArgs e)
    {            
        base.OnPreRenderComplete(e);
        check.Visible = false;
    }

ここでの問題は、ポストバックが発生したとき(ボタンをクリックしたとき)、Page_loadイベントで、チェックボックスがツールチップとテキストのビューステートを維持していることに気付くということです。ただし、チェックされた状態はfalseに変更され、CheckedChangedイベントが発生します。なぜその振る舞いなのですか?

また、PageLoad()またはOnPreRender()イベントのいずれかでチェックボックスの可視性を設定した場合、チェックボックスのチェック状態はポストバック間で維持され、CheckedChangedイベントは発生しません。

OnPreRenderCompleteイベントで可視性が変更され、チェックボックスがデフォルトでオフの状態になると、どう違うか知りたいだけです。

4

1 に答える 1

1

質問を正しく理解していなかったため、最後の回答を削除するようにマークしました。

あなたがやっていることは次のとおりです。

  1. サーバー側の Init イベントで実行時にチェックボックスを追加しました。
  2. 次に、ページの読み込み時に、Not Post Back チェックでその値を true に設定します。
  3. 次に、OnPreRenderComplete イベントで可視性を false に設定します

サーバー側で可視性を false に設定すると、コントロールはクライアント側で生成されません (ページ ソースを表示することで確認できます)。コントロールはクライアント側で作成されないため、ページをポストバックすると、チェックボックスがページの初期化で作成され、クライアント側ではなかったため、ドットネットはその最後の値を認識していないため、チェックボックスで false を取得します。

さらに確認する必要がある場合は、OnPreRenderComplete イベントを次のように変更します。

protected override void OnPreRenderComplete(EventArgs e)
    {
        base.OnPreRenderComplete(e);
        //check.Visible = false;
        check.Style.Add("display", "none");
    }

上記の行により、スタイルがコントロールに追加されるため、コントロールはクライアント側で生成されますが、表示されず、ポストバック中にその値を取得します。

于 2012-09-05T13:12:45.170 に答える