【问题标题】:Checkbox checked state change when visibility is set to false可见性设置为 false 时复选框选中状态更改
【发布时间】:2012-09-05 09:21:59
【问题描述】:

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

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

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

【问题讨论】:

  • 那有什么用?是好奇心吗?页面生命周期是一个众所周知的谜。

标签: asp.net viewstate


【解决方案1】:

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

你正在做的事情是:

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

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

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

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

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

【讨论】:

  • 哇,我为你的问题投了 1 票,现在我意识到文本和工具提示被保留了,但没有检查值。 :$
  • 当我解码页面的视图状态时,我发现其中存在文本和工具提示值,并为选中的值闪烁,这是一个非常奇怪的行为。
  • 我遇到了另一个转折,在初始化事件中,我每次都为复选框分配一个新 ID,例如:check.ID = "chkMyCheckBox" + DateTime.Now.Second.ToString ();如果我这样做,复选框将保留其选中值,并且 CheckedChanged 事件也不会触发。
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多