动态用户控件内的用户控件点击事件没有触发?

时间:2012-08-06 19:10:39

标签: c#

我有一个div存在div的页面,使用用户控件的LoadControl通过代码动态添加用户控件。

用户控件包含另一个用户控件(比如ChildUC)。 ChildUC包含一个gridview,其中包含Insert和Delete按钮。

问题是,即使我点击这些按钮,也不会触发click事件,也不会触发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

1 个答案:

答案 0 :(得分:0)

您需要了解的是asp.net page life cycle从前端接收事件的位置。

触发回发的事件被发送回asp.net是一个隐藏的表单元素,称为事件目标。

此输入在名为ProcessPostData的函数中处理。 如果到那时控件集合中没有您的控件,则它无法接收该事件。所以你得到一个回发,但没有事件处理程序被触发。

这意味着,如果您希望触发事件处理程序,则必须在load事件之前创建所有控件。看来你必须根据一些用户输入决定加载哪些控件。用户输入在Init上不可用。您可以覆盖LoadViewState方法,并在那里处理您的用户输入。

Page life cycle