当可见性设置为false时,复选框选中状态更改

时间:2012-09-05 09:21:59

标签: asp.net viewstate

我无法理解在页面生命周期的各个阶段设置复选框可见性对已检查状态的影响。

以下是动态创建的复选框的示例代码。

    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事件中更改可见性时会发生什么不同,以便将复选框默认设置为未选中状态。

1 个答案:

答案 0 :(得分:1)

我已经标记了我的最后一个删除答案,因为我没有正确理解这个问题。

你正在做的事情是:

  1. 您在运行时在服务器端的Init事件中添加了复选框。
  2. 然后在页面加载中,在非回发检查中将其值设置为true。
  3. 然后在OnPreRenderComplete事件
  4. 中将其可见性设置为false

    在服务器端将可见性设置为false时,不会在客户端生成控件(您可以通过查看页面源来检查它),因为在客户端未创建控件,因此当您回发页面时,复选框是在页面init中创建的,因为它不在客户端,所以dot net不知道它的最后一个值,所以你得到的复选框为false。

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

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

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