2012-09-05 70 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事件也不會觸發。 –

相關問題