close

 

動態產生Server端控制項

因為最近做的Project需要利用動態產生Server端控制項,在整個過程中,從了解怎麼做到完成, 在技術上遇到蠻多問題,幸而有許多網友知識的分享,才得以完成.

過程大致分成幾部分:

1.依照設定值來動態產生表單(加入控制項與事件)

2.表單reload時,Keep控制項的ViewState以及動態增刪控制項

3.抓取控制項的值,Insert to DB

       動態產生的Ideal真的很好,因為表單的欄位很多,而且變動性大,所以考慮到利用設定的方式來產生表單,避免每次修改表單都需要

修改程式中的欄位.這叫立意良好...指不過實作上還真的遇到不少問題...當然也因此學到不少東西啦...

1.動態產生Server端控制項的概念

 -->控制項的產生, Page.FindControl() 搜尋控制項,尤其是了解 Page 事件順序其實就是了解ASP.NET如何紀錄控制項的ViewState

1.1 控制項的產生 ,這邊的this.Form 可以換成其他Controls(Panel,PlaceHolder,table..)

            
            TextBox textbox = new TextBox();
                    textbox.ID = "tbID";
                    textbox.Width = 50;
                    this.Form.Controls.Add(textbox);
                    this.Form.Controls.Add(new LiteralControl("<BR>"));
   

1.2 Page.FindControl() 搜尋控制項

 
      TextBox textbox = Page.FindControl("tbID") as TextBox;
        if (textbox != null)
        {
        Response.Write(textbox.ID); 
        }
 

2.動態產生表格及事件攔截 Part2

-->真的是一篇好文章,原來表格是這樣動態產生出來的...

 

3. 控制項的ViewState

-->執行過程中一度發生 Failed to load viewstate

     ViewState and Dynamic Control 這一篇文章對於發生錯誤的原因,有很詳細的說明過程

 -->文章中的結論: 會發生Failed to load viewstate 的原因,因為在動態產生控制項的過程中

     ,ViewState中紀錄的值與Form的控制項,在對應時(將ViewState的值設定給控制項時)發生錯誤

     因為ViewState的值紀錄的方式是index,而非用該控制項的ID來記錄,所以再增刪控制項後,

     將ViewState的值設定給控制項時可能是對應到錯誤的控制項,當該控制項沒有其屬性時,

     便會出現 Failed to load viewstate

 

4.刪除控制項

-->這邊要特別注意增刪控制項的過程中,如果需要Page reload可能會導致

   上面 Failed to load viewstate 的錯誤,有些網友會建議將該控制項的 viewstate設定false

   就可以解決問題.但是如果仍要記錄viewstate,那要怎麼辦呢?

   我想出一個替代方案就是將該元件隱藏.

   以我自己的例子來說,把table表單中的TR 的tablerow.Visible = false; 就可以了..

    原來所有HTML 中的元件都有Visible的屬性,只能說..這真是太神奇了...

 
      TextBox textbox = Page.FindControl("tbID") as TextBox;
        if (textbox != null)
        {
         his.Form.Controls.Remove(textbox); 
        } 
 

最後跟大家分享另外一個這次用的小技巧--PostBack後回到原來的位置

 有兩種方法可以做:

1. Page.SmartNavigation 屬性 設定 True

2. 另外就是不透過Page.SmartNavigation 也可以做到,

    因為Page.SmartNavigation 的設定在新開子視窗時,會一直跳回母視窗,所以不適用

     Scroll to Control on Page without SmartNavigation,參考文章中提到的方法,

     也可以在畫面reload時,視窗自動跳到上一次最後執行的位置

arrow
arrow
    全站熱搜

    irealchen 發表在 痞客邦 留言(0) 人氣()