2012-09-05 126 views
2

我在理解设置复选框可见性对页面生命周期各个阶段的选中状态的影响时遇到了一些问题。当可见性设置为false时,复选框选中状态更改

下面给出了一个动态创建的复选框的示例代码。

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

+0

那有什么用?好奇吗?页面生命周期是一个已知的谜团。 –

回答

1

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

那么你正在做的事情是:

  1. 您在运行时初始化事件添加的复选框,在服务器端。
  2. 然后,在页面加载中,您将其值设置为“不回复”检查中的值为true。
  3. 然后,你的知名度设置为false OnPreRenderComplete事件

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

如果您需要更多进一步的检查,改变你的OnPreRenderComplete事件为:

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

通过以上线,风格被添加到控制,所以在客户端产生的控制,但不可见的,你会在后期得到它的价值。

+0

哇,我已经为你的问题投了1票,现在我意识到文本和工具提示被保留,但没有被检查的值。 :$ –

+0

当我解码页面的视图状态时,我发现其中存在文本和工具提示值,并且检查了值,这是一个非常奇怪的行为。 –

+0

我还遇到过更多的麻烦,在Init事件中,我每次都在复选框中分配一个新ID,如:check.ID =“chkMyCheckBox”+ DateTime.Now.Second.ToString();如果我这样做,复选框将保留其选中的值,并且CheckedChanged事件也不会触发。 –

相关问题