2012-08-06 67 views
0

我有一個頁面,其中有一個div,爲此用戶控件通過使用用戶控件的LoadControl代碼動態添加。用戶控件裏面的動態用戶控件點擊事件不會觸發?

用戶控件包含另一個用戶控件(可以說ChildUC)。 ChildUC包含一個具有插入和刪除按鈕的gridview。

問題是,即使我點擊這些按鈕,點擊事件不會被觸發,也不會觸發gridview命令事件。 頁面正在回發並剛剛在頁面加載後退出,它不會觸發任何其他事件。

到目前爲止,我正在調試這幾天,但沒有運氣。

請幫幫我。提前致謝。

代碼:

<div id="dvMain" runat="server"> 
    </div> 

    private void CreateHeaders() 
    { 

     foreach (Header hd in HeaderCollection) 
     { 
      List<Question> lstQuestion = QuestionCollection.FindAll(p => p.HID.Equals(hd.HeaderID)); 
      Sales_UserControls_Questions Question = null; 
      if (lstQuestion.Count > 0) 
      { 
       Question = (Sales_UserControls_Questions)LoadControl("~/Sales/UserControls/Questions.ascx"); // This is the main user control that is being loaded dynamically 
       Question.ID = "Question"+hd.HID; 
       Question.lstQuestions = lstQuestion; 
      } 
      dvMain.Controls.Add(Header); 
      if (HQQuestion != null) 
       dvMain.Controls.Add(Question); // user control being added to div 

     } 
    } 

    //Questions.ascx 

<div> 
    <asp:GridView ID="grdContent" runat="server" AutoGenerateColumns="False" 
     OnRowDataBound="grdContent_RowDataBound" EnableTheming="False"> 
     <Columns> 
      <asp:TemplateField ShowHeader="false"> 
       <ItemTemplate> 
        <asp:HiddenField ID="hdnQuestionID" runat="server" Value='<%# Eval("QID") %>' /> 
        <asp:HiddenField ID="hdnQuestionType" runat="server" Value='<%# Eval("QTP") %>' /> 
        <asp:Label ID="lblQuestionID" runat="server" EnableTheming="False" Text='<%# Eval("QID") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField> 
       <HeaderTemplate> 
        <asp:Label ID="lblSHR" runat="server"></asp:Label> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <asp:Label ID="lblText" runat="server" Text='<%# Eval("Text") %>'></asp:Label> 
        <div> 
         <asp:UpdatePanel ID="UpnlDGV" runat="server" UpdateMode="Conditional"> 
          <ContentTemplate> 
           <DG:View ID="ucDGView" runat="server"></DG:View> 
          </ContentTemplate> 
         </asp:UpdatePanel> 
        </div> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
</div> 
//end of questions.ascx 

//ucDGView.ascx 
<div> 
    <asp:GridView ID="grdDGView" runat="server" 
       AutoGenerateColumns="False" OnRowDataBound="grdDGView_RowDataBound" OnRowDeleting="grdDGView_RowDeleting" 
       OnRowCreated="grdDGView_RowCreated" HeaderStyle-Font-Bold="true" OnRowCommand="grdDGView_RowCommand"> 
       <Columns> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <dl id="dvNT" runat="server"> 
              <dt> 
               <asp:Label ID="lblNT" runat="server" Text="NT:"></asp:Label> 
              </dt> 
              <dd> 
               <asp:DropDownList ID="ddlNM" runat="server"> 
               </asp:DropDownList> 
              </dd> 
             </dl> 
             <dl id="dvOSD" runat="server" class="grid_6 alpha MT10" visible="false"> 
              <dt> 
               <asp:Label ID="lblOSDT" runat="server" Text="OSDT:"></asp:Label> 
              </dt> 
              <dd> 
               <asp:TextBox ID="txtOSDT" runat="server" MaxLength="10" CssClass="maskDate"></asp:TextBox> 
               <asp:CalendarExtender ID="txtOSDTE" runat="server" TargetControlID="txtOSDT" 
                Enabled="True" Format="MM/dd/yyyy"> 
               </asp:CalendarExtender> 
              </dd> 
             </dl> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <asp:ImageButton ID="imgBtnDelete" runat="server" ImageUrl="~/Sales/Common/Images/delete_red_mini.jpg" 
           CausesValidation="false" CssClass="cancel" CommandName="Delete" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "OID")%>' /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <asp:ImageButton ID="imgBtnAdd" runat="server" ImageUrl="~/Sales/Common/Images/PLUS_MINI.png" 
           CausesValidation="false" CssClass="cancel" CommandName="Add" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "QID")%>' /> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
    </asp:GridView> 
</div> 
//end of ucDGView.ascx 
+0

很難說肯定的,但如果是回發,而不是觸發事件,儘量在包裹如果(!的IsPostBack)代碼{代碼}通常我有過情況下,代碼會回當我想讓它首先做某件事情時,結果就像是一個新的頁面加載。 – Brian 2012-08-06 19:20:05

+0

大腦感謝你的回覆,但它已經在回發。 – user788312 2012-08-06 19:47:53

回答

0

你需要明白這裏是什麼在哪裏asp.net page life cycle它接收來自前端的事件。

觸發回發的事件發回到asp.net是一個隱藏的表單元素,稱爲事件目標。

該輸入在名爲ProcessPostData的函數中處理。 如果到那時您的控件不在控件集合中,它就無法收到該事件。所以你得到一個回傳,但沒有事件處理程序被解僱。

這意味着,如果您希望觸發事件處理程序,則必須在加載事件之前創建所有控件。看起來您必須根據某些用戶輸入來決定加載哪些控件。用戶輸入在Init上不可用。您可以覆蓋LoadViewState方法,並在那裏處理您的用戶輸入。

Page life cycle

+0

非常感謝您的回覆。我理解這個概念,但是我在頁面上有100個控件,需要在Init上加載,這會導致頁面無響應。所以,請讓我知道是否有任何其他解決方案。 – user788312 2012-08-06 20:19:14

+0

無論您在頁面生命週期中的哪個位置添加它們,它都會花費相同的處理時間。我想你並不是每次都增加100個。添加哪些控件的決定取決於在頁面呈現時添加哪些控件。在'ViewState'中保存這個決定有助於僅將這些控件添加回下一個Postback – nunespascal 2012-08-06 20:34:15

+0

否,因爲所有這些用戶控件都是動態添加的,所以我沒有掌握這些控件。 – user788312 2012-08-06 20:56:50