動態產生Server端控制項
因為最近做的Project需要利用動態產生Server端控制項,在整個過程中,從了解怎麼做到完成, 在技術上遇到蠻多問題,幸而有許多網友知識的分享,才得以完成.
過程大致分成幾部分:
1.依照設定值來動態產生表單(加入控制項與事件)
2.表單reload時,Keep控制項的ViewState以及動態增刪控制項
3.抓取控制項的值,Insert to DB
動態產生的Ideal真的很好,因為表單的欄位很多,而且變動性大,所以考慮到利用設定的方式來產生表單,避免每次修改表單都需要
修改程式中的欄位.這叫立意良好...指不過實作上還真的遇到不少問題...當然也因此學到不少東西啦...
-->控制項的產生, 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); }
-->真的是一篇好文章,原來表格是這樣動態產生出來的...
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時,視窗自動跳到上一次最後執行的位置
留言列表