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 时,不会在客户端生成控件(您可以通过查看页面源来检查它),因为不会在客户端创建控件,因此当您回发页面时,复选框为在页面 init 中创建并且由于它不在客户端,所以 dot net 不知道它的最后一个值,所以你得到的复选框是错误的。

如果您需要进一步检查,请将 OnPreRenderComplete 事件更改为:

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

通过上面的行,样式被添加到控件中,因此控件在客户端生成但不可见,您将在回发期间获得它的值。

于 2012-09-05T13:12:45.170 回答