none
動態載入UserControl遇到的一個問題 RRS feed

  • 問題

  • 1.aspx
    |
    |__ B.ascx ( UserControl ) 直接崁在頁面上,因為永遠不會變
    |
    |
    |__ C.ascx ( UserControl ) 動態,因為會依據 B.ascx的內容值,再去Table 找對應


    1.aspx

    protected void Page_Load(object sender, EventArgs e)
    {
    
       // 問題在這裡,因為1.aspx的Page_Load還沒跑完,根本還沒載入 A.ascx 這個 UC
       DropDownList ddl_InsCode = (DropDownList)ucInstrumentsChooseInfo.FindControl("ddl_InsCode");
       _InsCode = ddl_InsCode.SelectedValue;
    
       // 基本檔抓設定的 tmpClass.QCode
    
       // 導致這抓不到對應的資料 tmpClass.QCode = Null
       System.Web.UI.UserControl myUC = (System.Web.UI.UserControl)LoadControl("~/UserControl/XXX.ascx" + tmpClass.QCode);
       myUC.ID = "QuestUC";
       this.PlaceHolderLoadControl.Controls.Add(myUC);
    }

    其實我 C.ascx 要觸發點是在,1.aspx 頁面上有一個 ListView 的 OnItemCommand

    可是如果把上面 上面的 Code 搬到 → ListView 的 OnItemCommand 會正常顯示,

    但是不知道為何當我觸發 ListView 的 OnItemCommand → B.ascx上面的所有按鈕會全部失效,

    (DeBug模式,發現根本只有進去 1.aspx 的 Page_Load就結束程式了... ???)

    搞不懂不知道是什麼原因 @@...


    示意圖


    上面的 tmpClass.QCode 我如果寫死給值的話,所有功能就正常了...

    所以最簡單的方法是,如果再Page_Load我能抓的到 B 這個 UserControl的值的話,應該就正常了

    (但是 Life-Cycle 的順序不允許這件事情.. Orz)

    測試過在 OnPreRender 寫那段... 但是,當觸發 ListView 的 OnItemCommand 後才會觸發 OnPreRender ,所以來不及了><?

    不知道怎麼辦是好 @@




    • 已編輯 天氣 2014年12月15日 上午 07:52
    2014年12月15日 上午 06:05

解答

  • 動態生成有一個很重要的地方,就是當 PostBack 回來時,你的相關控制項就要準備好,才能被 PostBack 看到。

    如果你做不到這一點,當然沒辦法成功。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 天氣 2015年8月21日 上午 06:05
    2014年12月15日 上午 08:14
    版主

所有回覆

  • 狀態是你自己要記錄,有動態處理的話也是要等你把自己的狀態讀出來再做。

    過多的 user control 動態處理只會讓你更難做,是否考慮不要做這麼多動態的效果?


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年12月15日 上午 06:14
    版主
  • 狀態是你自己要記錄,有動態處理的話也是要等你把自己的狀態讀出來再做。

    過多的 user control 動態處理只會讓你更難做,是否考慮不要做這麼多動態的效果?


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    Hello 小朱:

    我UC其實只有兩個,其實已經濃縮了

    上面:藍色UC主要在選擇【地點、儀器】6個頁面可以共用。※這我固定拉在頁面上因為不會動態

    下面:黑色問卷單,這個就要對應上面儀器,3個頁面共用。※ 這個一定要動態

    我真正的動態也只有黑色那一塊,要配合選到的儀器代碼 → 再去儀器基本檔內取得﹝黑色﹞問卷要讀哪一張

    這個拉成UC應該沒錯疑慮吧 >< ?

    ==========================

    我找到方法解決了~

    剛剛把整個觸發點的 Lift Cycle,

    用紙寫了一下來,發現!!!

    Lift Cycle 上半部產生出後來,每次點擊觸發,ListView的 OnItemCommand 時,只會先經過 Page_Load 而已

    這時候Try Catch包我那段程式即可,反正第一次進去會自動到Catch,之後的Load都抓的到我上面的 DDL了)→ OnItemCommand 

    正好被我利用

    YA~~~


    • 已編輯 天氣 2014年12月15日 上午 08:15
    2014年12月15日 上午 07:43
  • 建議你先看看去了解怎樣動態載入UC

    .

    How to: Create Instances of ASP.NET User Controls Programmatically

    http://msdn.microsoft.com/en-us/library/c0az2h86(v=vs.140).aspx

    .

    Dynamic Loading of ASP.NET User Controls

    http://www.codeproject.com/Articles/59781/Dynamic-Loading-of-ASP-NET-User-Controls


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2014年12月15日 上午 08:13
  • 動態生成有一個很重要的地方,就是當 PostBack 回來時,你的相關控制項就要準備好,才能被 PostBack 看到。

    如果你做不到這一點,當然沒辦法成功。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 天氣 2015年8月21日 上午 06:05
    2014年12月15日 上午 08:14
    版主
  • 雖然自己解決了,還是謝謝各位看了我的問題文。

    分享一下我的作法

    剛剛紙筆戰術後,其實發現重點就是因為

    Lift Cycle 的關係所以第一次進網頁,由於順序是


    主頁面 Page_Load → 使用者自訂物件 B 的 Page_Load →  使用者自訂物件 C 的 Page_Load

    但由於我的C必須要由 B的資料來產生。

    所以一開始在 Page_Load 會抓不到 B 的值

    1. 第一次抓不抓的到不重要

    2. 我真正需要 C的時候是在,頁面中間的ListView → OnItemCommand

    3. 主頁面上這個ListView 的 OnItemCommand 被觸發前,只會經過【主頁面 Page_Load】

    所以..... 發現把Code搬進來就下課了

    protected void Page_Load(object sender, EventArgs e) {

                if (!IsPostBack)
                {
                    InitPage();
                }
                else
                {

                    // Oooooops 整段放在這就好了 hahaha~~

    // 取得使用者選的值 DropDownList ddl_InsCode = (DropDownList)ucInstrumentsChooseInfo.FindControl("ddl_InsCode"); _InsCode = ddl_InsCode.SelectedValue; // 由上方使用者選的值,到基本檔抓設定的 tmpClass ~~ // 動態產生到畫面上 System.Web.UI.UserControl myUC = (System.Web.UI.UserControl)LoadControl("~/UserControl/XXX.ascx" + tmpClass.QCode); myUC.ID = "QuestUC"; this.PlaceHolderLoadControl.Controls.Add(myUC); } }

    每次點OnItemCommand時,都會註冊一次~

    這樣我 OnItemCommand 那邊就正常了 ^^,C 裡面的功能,剛剛測試也都正常了

    搞了我一天 @@a



    • 已編輯 天氣 2014年12月15日 上午 08:51
    2014年12月15日 上午 08:37