經常見到有人說在中不要使用動態控件我想主要的原因在於使用動態控件會帶來一些問題在做項目的過程中我將由動態加載控件引發的總是作了一個小小的總結
在使用LoadControl加載控件後用戶控件中的某些控件不再響應事件
這個問題主要是由於將控件加載放在if (!PageIsPostBack)之內引起的放在外面即可在思歸的blog上對此問題進行了詳細的說明
用戶控件中某些控件的響應出現問題如某個按鈕第一次選擇時不觸發CLICK事件第二次可以了
這是由於沒有給控件設置ID引起的控件ID的作用在下面詳細講述 如
Control userControl=(Control)PageLoadControl(Testascx);
userControlID=Test;
AddControl(userControl);
如果用戶控件中包括DataGrid控件那麼加載控件後可能出現不響應DataGrid事件的問題
這好像是一個bug必須要將加載的控件進行強制轉換如
Test userControl=(Test)PageLoadControl(Testascx);
注意上面使用的是Test類型而不是Control!
我在以前的Blog中曾提到過這個問題這種方式將使系統的擴展性降低 我有一個解決方案可以和大家討論(運用策略模式)
public class BaseControl : SystemWebUIUserControl
{
public virtual BaseControl ProcessThisControl();
}
所有的用戶控件從BaseControl 繼承如果有Datagrid控件由overide ProcessThisControl方法 如
return this as Test;
按如下方式加載控件
BaseControl userControl=(BaseControl )PageLoadControl(Testascx);
userControlProcessThisControl();
在用戶控件中如何使用JavaScript
大家都知道使用客戶端的腳本將大大提高頁面的響應速度同時可以避免頻繁地刷新頁面所以使用javascript來實現頁面中部分控制是一個比較好的方式但是在用戶控件中如果訪問某一個子控件呢?
使用方式如下 documentall<%= TestControlClientID%>disabled=true; //將TestControl設置為不可用
如果在C#腳本中應該這樣寫PageRegisterStartupScript(OnInitControl<SCRIPT LANGUAGE=JavaScript>documentallTest_TestControldisabled=true;</SCRIPT>); //Test為用戶控件TestControl為用戶控件中的子控件
現在說一下控件ID在訪問aspx文件時IIS會將aspx的腳本進行編譯編譯的時候將用戶控件中的內容寫在同一個頁面中為了防止頁面中的控件與用戶控件中的控件名稱相同在編譯的時候對用戶控件中的控件名稱修改為 用戶控件名子控件 控件ID則修改為 用戶控件ID_子控件ID 在動態加載控件時如果不對控件的ID進行賦值則控件ID為上一次加載的控件ID因此在加載用戶控件後應該立即對其設置ID
From:http://tw.wingwit.com/Article/program/net/201311/12620.html